[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문
[추가질문] 위에서 다른 학우분이 질문해주신 것에 대한 추가 질문입니다! answer가 y, Y, yes, YES, Yes... 등 개수가 많아져서 일일이 or를 적어주기 힘들 때는 지난 강의(13강)에서 enum 지정해줬던 것처럼 그룹으로 만들어서 해당 그룹/인덱스 안의 string이면 정답처리 할 수 있을 것 같은데 그럴 때는 어떤 함수를 쓰면 될까요? enum말고 estring 등이 있나요? estring Answer { YES = 0 Yes = 1 yes = 2 Y = 3 y = 4} Do Console.WriteLine("강사님은 잘생기셨나요? (y/n): "); string Answer = Console.ReadLine(); } while (answer != Answer); 이런 식으로요! 그리고 y/n 말고 아예 엉뚱한 답(0, ㅋ, ' 등)을 적는 사람에게는 "YES or NO 중 골라주세요" 와 같은 문장을 출력하고 다시 while문으로 돌아가게 하고 싶다면 방법이 있을까요? 이 땐 while문이 아니라 if문을 결합해야 할까요? 알려주시면 감사하겠습니다!
강의의 4:40초인 Debug.Log(Input.mousePosition); 에서는 정상 작동을 하는데 그 이후 과정인 Debug . Log ( Camera . main . ScreenToViewportPoint ( Input . mousePosition )); 을 입력하고 실행 시 위의 널레퍼런스익셉션 오류가 뜨네요 ㅠㅠ 어떻게 해결해야하나요?
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문
수업 중 아이템 id가 약 21억개를 초과하여 int로는 더 이상 할당을 못 하게 될 수 있기 때문에 라이브 게임의 경우 처음부터 long을 쓰는 것이 좋은 선택일 수 있다고 하셨는데요 long의 경우 음수까지 커버하는데 아이템 id가 음수가 될 일은 없다고 생각합니다. 그런 경우엔 long보다 uint를 쓰는 것이 용량면에서 더 효율적이지 않을까 생각했는데 실제로 사용할 경우 어떤 차이가 있는지 알 수 있을까요? 더 장기적으로 봤을 때 uint를 쓰더라도 id가 그 수를 초과할 수 있기 때문에 그냥 편하게 long을 쓰는 게 좋은 건지, 아니면 uint와 long 사이에 문법적인 사용 차이 등이 있는지를 알고 싶습니다.
17:27에서 int depth = r.Depth +1; while(r.Read()) { if(r.Depth != depth) break; } 코드가 이렇게 됐었는데 <packet name="PlayerInfoReq"> <long name ="playerId"/> <string name ="name"/> <list name ="skill"> <int name="id"/> <short name ="level"/> <float name ="duration"/> </list> </packet> 그러면 <list name = "skill"> 다음 줄을 들어갈때는 while에서 빠져나가게 되는거 아닌가요
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
이번 강의를 보면서 궁금했던 점 중 하나가 맵에 대한 정보를 사전에 만들어서 클라와 서버가 사용하는 방식의 경우 특정 사용자가 악의적으로 맵에 대한 정보를 클라쪽에서만 수정할 수 있을 거 같습니다. 해당 방식말고 서버측에서만 맵 데이터를 만들고, 클라이언트가 접속을 할 때 서버측에서 파일을 전송하거나 정보를 제공하는 방식으로도 구현하는 경우가 있나요? 다른 궁금점은 타일맵같은 경우는 충돌판정이 비교적 간편해서 사용자가 손쉽게 구현하여 적용할 수 있는데, 2D, 3D 충돌판정은 타일맵보다 복잡하고 성능을 많이 잡아먹는데 서버측에서 계산하여 클라이언트에게 충돌 판정여부를 알리나요? 굳이 알리지 않더라도 2D, 3D 게임에서 충돌판정여부를 서버 측에서도 계산하여 Hit판정이나 이동가능 판정같은 거를 게임에 적용하나요?
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
선생님처럼 저도 처음에는 캐릭터가 화살로 나가서 당황을 했엇는데, 캐릭터가 벽이나 화면 끝에 도달하지 않았는데 삭제가 될때 뻑이 나고 서버가 종료가 되서 원인을 찾아보니 화살의 CellX Y와 CellX Y를 토대로 얻어낸 배열 인덱스값을 화살이 움직일때마다 출력해 줬더니 위와같이 나왓습니다. 클라에선 벽이나 맵끝에 도착하지 않았지만 서버에서는 이미 도착한것으로 인식되었다는걸 확인했습니다. 제가 파악하기론 foreach문에 진입하고 나서 화살의 Update문을 실행햇는데 화살이 벽에 도착하거나 맵 끝에 도착해서 이 부분에서 삭제가 된 후 빠져나오면서 위처럼 조건을 다시 검사할때 여기서 에러가 납니다. 정리해보면 첫번째로는 서버에서는 화살의 움직임의 연산이 끝낫지만 클라에서는 물체의 속력이 빠르지 않아서 벽이나 맵끝에 닿기도 전에 삭제되는데, 서버의 프레임과 클라의 프레임을 맞추지 않아서 발생하는 문제인가요? 두번째로는 뻑이나는 부분인 foreach를 이용해서 ProjectTiles를 순회하는도중에 순회대상인 ProjectTile이 안쪽에서 삭제가 되어서 바깥쪽으로 나올때 에러가 나는것 같은데 이부분은 어떻게 해야 할까요..
안녕하세요 ㅎㅎ 강의를 들으며 토이프로젝트로 조그마한 게임을 하나 만들고 있습니다. 몇 가지 궁금한 점이 생겨 질문드립니다. Q1.1) 아래 사진은 루카노르 백작 이라는 게임입니다. 캐릭터가 위의 문을 열고 들어가면 빌런인 염소가 존재합니다. 문제는 이 방을 나갔다 새로 들어와도 염소의 자리는 그대로 방을 나갈 당시 위치에 있습니다. 게임을 해본 추억을 되짚어 보니 두 가지로 나뉘더군요 1) 방을 나갔다 다시 들어오면 몹이 초기 젠 자리로 가있는 경우 2) 방을 나갔다 들어와도 아래와 같이 몹이 그자리 그대로 있는경우 1)번의 경우 모든걸 초기화하고 새로 만들면 될 것 같은데 2)번의 경우 기존의 정보를 어떤 방식으로 관리하는지 궁금합니다. 만약 던전의 방도 Scene으로 관리한다면 본 강의의 예제에서는 Scene간의 전환시 Manager를 통해 clear하는데 어떤식으로 코드를 수정해야할지 여쭙고싶습니다. 횡설수설하지만 정리해서 말씀드리면.. Scene전환시 이전 Scene으로 돌아갈때 이전 Scene의 상태를 그대로 유지한상태로 돌아가는 방법은 무엇인가요? Q2) 또 한가지 의문은, 리니지나 디아블로의 경우 던전의 한 층 자체를 Scene으로 관리할 것 같은데 아래와 같이 던전 내에 여러개의 문이 있고, 문에 입장하면 장면이 전환되는 경우 던전 내의 방들은 Scene으로 관리하나요? 설계는 개발자 마음대로라지만 Rookiss님이 게임을 만드신다면 어떻게 설계하실지 궁금합니다.
InputManager의 작동 원리가 잘 이해되지 않습니다. 그래서 디버깅으로 한 줄 한 줄 따라가 봤는데, 여전히 궁금한 점들이 있습니다. 1. 왜 InputManager _input = new InputManager();를 읽은 뒤 Init()를 다시 실행해서 DonDestroyOnLoad(go);를 읽는 건가요? Init();은 Start에 들어 있으니 첫 실행 때 한 번 호출되고 끝이어야 하는 게 아닌가요? 2. Managers의 업데이트에서 OnUpdate를 계속 호출해 줘서 키 입력을 감지하는 건 알겠는데 키 입력이 들어온 뒤 KeyAction.Invoke();가 어떤 역할을 하는지 모르겠습니다. 혹시 InputManager에서 if( KeyAction != null)일 경우 바로 OnKeyboard()를 호출하는 게 문법적으로 불가능하기 때문인가요?
클라이언트에서 보낸 데이터가 다 도착하지 않았을 때 다음 데이터가 올 때까지 기다린 후 처리한다고 말씀하셨는데, 이 부분이 코드 어디에 구현되어있는건가요...? 위에 있는 코드를 나름대로 해석해보니 1. OnWrite()는 _recvArgs.Buffer에 들어있는 데이터만큼 _recvBuffer의 _writePos를 증가시킨다. 2. OnRecv()한 데이터(_recvArgs.Buffer에 들어있는 데이터)의 크기를 processLen에 담는다. 3. processLen의 크기만큼 _readPos를 증가시킨다. 라고 이해했는데, 클라이언트에서 보낸 데이터가 완전한지 불완전한지 딱히 판단하는 부분은 없어보이고 그냥, [1.데이터가 들어온만큼 _writePos를 증가시킨다 2. 처리한다 3. 처리한만큼 _readPos를 증가시킨다]를 실행시킨거같아서요!
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
안녕하세요, 스승님.. 질문이 있습니다. Speed를 서버를 통해 받아오더라도., updateMoving()의 소스 자체를 해킹 당하면 캐릭터 이동속도 핵은 생기지 않나 궁금합니다. 예를 들어 스르륵 이동하는 코드의 Speed를 서버에서 받아오더라도, transform.position += moveDir.normalized * Speed * Time.smoothDeltaTime ; => transform.position += moveDir.normalized * Speed * Time.smoothDeltaTime *2; 이렇게 수정한다면, Destination 에 더빨리 도착하여 더 빨리 이동하겠다는 패킷을 빨리 보낼 수 있지 않나 싶어서요.. 이 경우 서버에서도 스르륵 부분을 구현하여 대략 어느정도 도착할 시간을 비교해서 구별하는 부분을 추가하여 대처를 해야하는 것이 맞는 것인지 궁금합니다.. 늦은 시간 질문드려 죄송합니다! 늘 상세히 답변 주시어 정말 감사드립니다.
dummyClient측에서 sendAsync를 하려고 할 때.. 에러가 발생합니다. 에러 내용 Unhandled exception. System.ObjectDisposedException: Cannot access a disposed object. Object name: 'System.Net.Sockets.Socket'. at System.Net.Sockets.Socket.SendAsync(SocketAsyncEventArgs e, CancellationToken cancellationToken) at System.Net.Sockets.Socket.SendAsync(SocketAsyncEventArgs e) at ServerCore.Session.RegisterSend() in /Users/mini/Desktop/projects/Game/MMO_Server_Tutorial/ServerCore/Session.cs:line 71 at ServerCore.Session.Send(ArraySegment`1 sendBuff) in /Users/mini/Desktop/projects/Game/MMO_Server_Tutorial/ServerCore/Session.cs:line 57 at DummyClient.GameSession.OnConnected(EndPoint endPoint) in /Users/mini/Desktop/projects/Game/MMO_Server_Tutorial/DummyClient/Program.cs:line 20 at ServerCore.Connector.OnConnectCompleted(Object sender, SocketAsyncEventArgs args) in /Users/mini/Desktop/projects/Game/MMO_Server_Tutorial/ServerCore/Connector.cs:line 42 그리고 찍히는 로그가.. 좀 이상한 것 같은데요.. [From Server]: 메시지 OnDisconnected: [fe80::1%1]:7777 OnConnected: [fe80::1%1]:7777 이러고 나서 바로 위 에러가 나버립니다. 도저히 원인을 찾을 수 없을 것 같아서 질문 남겨드립니다..
안녕하세요 항상 좋은 강의 잘 듣고 있습니다. jobqueue에 대해서 궁금한 점이 생겨 질문드리게 되었습니다. 질문1) 예를 들어 ABCDE쓰레드가 거의 동시에 C_Chat 패킷을 핸들링할 경우, C_ChatHandler 가 아래와 같고("패킷을 받았습니다" 메세지 전송 추가) Push의 lock에 접근한 순서가 문자 순서대로 A가 1번 B가 2번...이라면 A쓰레드는 Flush를 수행한 후 클라이언트에게 "패킷을 받았습니다를" 보내주고 나머지 BCDE쓰레드들은 Flush를 수행하지 않고 큐에 넣기만 하고 "패킷을 받았습니다"라는 메세지를 보내게 되는 게 맞나요? 질문2) 위 내용이 맞다면 A쓰레드는 단지 1등으로 Push의 lock에 접근했다는 이유로 Flush(요리)를 수행하고, 응답("패킷을 받았습니다"라는 메시지 Send // Push로 등록한 action이 아닌 Push 이후의 흐름들)을 Flush수행 시간만큼 늦게 보내게 되는 것인데 뭔가 불합리?하다고 느껴집니다. 이런 정책을 많이 사용하나요?