월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
게임 룸 입장, 퇴장 관련 패킷이 궁금합니다
안녕하세요 게임 서버 개발자가 되고 싶어서 공부중입니다.카트라이더처럼 유저가 게임 룸을 만들고 원하는 룸에 입장하고, 퇴장하는 게임을 만들 때, 생성되어있는 게임 룸들의 리스트들을 서버에서 받아와야 하는데 이 때 룸 정보들을 요청하는 패킷, 예를들면 C_RoomList 같은 패킷이 필요할까요?그리고 룸에서 퇴장할 때도 C_LeaveRoom 같은 패킷이 필요한지 궁금합니다. 정확하게는 GameRoom 코드에서 LeaveGame과 ClientSession의 OnDisconnected가 어떻게 작동되는 것인지 궁금합니다.항상 좋은 강의 감사드립니다!!
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
게임 서버의 구조? 및 공부법에 대한 질문입니다.
안녕하세요! 루키스님 강의를 통해 서버를 공부하고 있는 한 대학생입니다.현재 학교에서 게임 서버와 관련된 전공이 따로 있지 않아 혼자 공부하며 졸업작품을 사전에 준비하려고 하는데요.게임에 사용되는 서버가 단순히 클라이언트를 연결해주는 서버 뿐만 아니라, 채팅 서버, 동기화 서버, NPC서버 등등.. 기능에 따라 분할하여 관리하는 경우가 많다고 들었습니다. (실제로 현업에서는 어떻게 관리되는지 모르겠지만 구글에서 찾아본 바로는 이렇게 알고 있습니다.)현재 MMORPG 게임 서버를 만드는 데에 있어서 어떠한 요구사항들이 필요한지 구조를 설계해보고 있는데,사실 현재 질문을 작성한 섹션까지의 강의를 보고 따라하면서도 코드가 잘 와닿지 않습니다.우선 제 생각은 처음부터 끝까지 우선 정독하며 코드를 따라 작성하며 다시 정주행하며 작성했던 코드들 하나하나 뜯어보고자 했는데, 현재 이해되지 않는 부분들을 이해하고 넘어가는게 좋을까요?또한 제가 처음부터 이쪽으로 공부했던 것이 아니라, 전과를 하여 전공지식에 있어서 부족한 점들이 있습니다. 특히 데이터 베이스나 웹에 대한 지식이 아직 없는데, 데이터 베이스를 공부한 뒤 서버를 공부하는 것이 좋을까요?해당 강의에서 알려주시는 서버에 관한 내용들은 위에서 제가 언급한 분할 서버들(채팅, 동기화 등)에서도 모두 활용이 되는 내용들일까요?아니면 전혀 무관하여 부가적인 공부가 필요할까요?클라이언트는 기존에 작게 프로젝트를 해본 경험이 있어 어느정도 익숙해졌다고 생각해 서버를 공부하기 시작한건데요.서버 프로그래밍이 매우 어렵다는 것을 알고 나름 강의를 수강하기 전 이론에 관해서도 어느정도 확립한 뒤 듣고있는데도.... 코드를 봐도 전체적인 흐름조차 잘 파악이 되지 않네요... 정상일까요?아니면 기본기가 부족하여 이해를 못하고 있는 것일까요?목표는 클라이언트 프로그래머이지만, 서버를 알고 클라이언트를 개발하는 것과 모르고 개발하는 것에 큰 차이가 있을 것이라고 생각해 작게라도 MMORPG를 한번 만들어보고자 하고 있는데, 어려운만큼 노력하면 되는건데도 시작점이 같지 않다는 핑계가 머리를 떠나지를 못하네요..아직 부족한 전공지식도 많은데 이런 내용들을 공부해도 괜찮은 걸까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
브레이크 포인트를 거는데 그냥 실행됩니다.
중단점이 현재 적중되지 않습니다. 이 문서의 기호가 로드되지 않았습니다.라고 뜨고 브레이크 포인트와 상관없이 그냥 실행됩니다.왜 그런걸까요 ㅠ
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
소켓 SendAsync 예외 발생시 대처방법에 대한 질문입니다
안녕하세요 선생님! 강의 잘 듣고 있습니다유니티 연동하면서 간혹 클라에서 서버로 보내는 과정에서 세션 클래스의 SendAsync 부분이 예외를 발생시켜 pendinglist 를 비워주는 clear 함수를 호출 하지 못해if (_pendingList.Count == 0) RegisterSend();영원히 send가 막히는 경우를 발견했습니다 try { bool pending = _socket.SendAsync(_sendArgs); if (pending == false) OnSendCompleted(null, _sendArgs); } catch (Exception e) { RegisterSend(); // 수정한 부분 Console.WriteLine($"RegisterSend Failed {e}"); } 이렇게 RegisterSend(); 를 다시 호출해서 SendAsync 가 될때까지 시도를 하는 방식으로 고쳤더니 send가 막히는 현상을 없애기는 했습니다만제가 생각하는 이 대처방법의 문제는 sendAsync가 계속 예외를 발생시키면 무한루프를 만들어서 이게 맞는 대처방법인지 의문이 듭니다...
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
온라인 게임 서버 운영체제
안녕하세요! 우선 좋은 강의 만들어 주셔서 감사합니다.공부를 하다가 문득 온라인 게임 서버가 보통 어떤 운영체제에서 서비스되는지 궁금해졌습니다.보통 웹 서비스를 리눅스로 많이 운영하다 보니 게임 서버 쪽도 차이가 없을 것으로 생각했는데, 국내에는 윈도우를 많이 사용한다는 이야기가 있더라구요.근데 워낙 오래전 글을 본 것이라 현재도 그러한지 궁금하네요.온라인 게임하면 보통 굵직한 회사로 넥슨과 NC가 있을 것 같은데요. 현업 관계자로서 보셨을 때 두 회사에서 주로 어떤 운영체제로 서비스하는지 자그마한 힌트를 주실 수 있을까 조심스레 여쭤봅니다!
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Read 함수
강의를 보고나서 코드를 다시보며 이해를 해보고 있었습니다. ReadOnlySpan을 만들어준 후 count += (ushort)를 2번 해주는데 이 부분이 이해가 안되더라구요 왜 그런건가요 ?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Packet Generator#2 string부분
안녕하세요이 부분까지는 실행이 잘되는 것을 확인하였습니다.그 뒤에 PacketFormat 부분에서실행시키면 아래와 같이 string부분은 입력이 안됩니다. 제 코드에서 틀린부분을 못찾겠어서 선생님이 올려주신 정답 코드로 다시 실행을 해보았는데똑같이 string부분이 입력이 안되는데 혹시 어떤 부분이 잘못되었는지 알려주실 수 있으실까요? class PlayerInfoReq { public long playerId; public void Read(ArraySegment<byte> openSegment) { ushort count = 0; ReadOnlySpan<byte> s = new ReadOnlySpan<byte>(openSegment.Array, openSegment.Offset, openSegment.Count); count += sizeof(ushort); count += sizeof(ushort); this. playerId = BitConverter.ToInt64(s.Slice(count, s.Length - count)); count += sizeof(long); } public ArraySegment<byte> Write() { ArraySegment<byte> segement = SendBufferHandler.Open(4096); bool success = true; ushort count = 0; Span<byte> s = new Span<byte>(segement.Array, segement.Offset, segement.Count); count += sizeof(ushort); success &= BitConverter.TryWriteBytes(s.Slice(count,s.Length-count), (ushort)PacketID.PlayerInfoReq); count += sizeof(ushort); success &= BitConverter.TryWriteBytes(s.Slice(count, s.Length - count), this. playerId); count += sizeof(long); success &= BitConverter.TryWriteBytes(s, count); if (success == false) return null; return SendBufferHandler.Close(count); } }
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Serialization #3 this.name
안녕하세요!강의를 수강하다가 질문이 생겨서 글 남깁니다.Serialization #3[08:30]name = "ABCD"의 문자열의 길이는 4이지만 byte배열로 변환하면 길이가 4byte가 아니라 8byte가 되는 것 까지는 이해하였습니다. 왜냐하면 C#은 UTF-16을 사용하므로 UTF-16은 문자들이 각 2Byte이기 때문입니다.Encoding.Unicode.GetByteCount(this.name)에서UTF-16기준으로의 바이트 배열로 변환됐을 때의 수를 가져오는 것이니까 그러면 위와 같이 8Byte인 것 같아서 어떻게 4Byte인지 궁금증이 생겨 질문 남깁니다!
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Send lock 관련 질문
public void Send(byte[] sendBuff) { lock (_lock) { _sendQueue.Enqueue(sendBuff); if (_pendingList.Count == 0) RegisterSend(); } } void OnSendCompleted(object sender, SocketAsyncEventArgs args) { lock (_lock) { if (args.BytesTransferred > 0 && args.SocketError == SocketError.Success) { try { _sendArgs.BufferList = null; _pendingList.Clear(); // Doing if (_sendQueue.Count > 0) RegisterSend(); } catch (Exception e) { Console.WriteLine($"OnSendCompleted Failed {e}"); } } } }수업을 들으면서 Send와 OnSendCompleted에 lock이 서로 다른 두개이상의 쓰레드가 동시에 sendQueue, pendingList에 Write하는 것을 방지하는 것이라고 이해했습니다.그리고 Send의 if문이 다른 쓰레드가 전송중일때를 체크하는 것이라고 들었는데 저 2개의 lock구조에서, 쓰레드A가 OnSendCompleted의 lock구역안에 있을 때 쓰레드B가 Send의 lock구역에 진입이 가능한지 궁금합니다.만약 접근이 안된다면 pendingList.Count가 항상 0이 되지않을까 생각하고 있습니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
디스어셈블리가 어디에 있는지 모르겠습니다 .
안녕하세요 수강생입니다. 강의를 듣다가 디스어셈블리를 찾고 있는데 없습니다. 강사님 VS에는 있는데 제가 쓰고 있는 VS에서는 없네요 어떻게 하면 될까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
vs에서 디버깅이 제대로 이루어지지 않습니다.
이 상태로 디버깅을 진행하였습니다.컨트롤 F5를 눌러 디버깅을 하면 이렇게 나오고F5만 누른다면 콘솔창도 뜨지않고 바로 디버깅이 중료됩니다. 위에 있는 시작 버튼을 눌러도 똑같이 디버깅이 바로 종료됩니다. 왜 이런걸까요 ?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
질문이 있습니다.
안녕하세요 저는 게임 서버에 관심이 있어서 혼자 독학하고 있는 대학생입니다. 다름이 아니라 Connector수업을 다 듣고 실행할라고 했는데 대상에 컴퓨터가 연결을 거부합니다. 이런 오류가 뜨는데 어떻게 해결 해야할지 모르겠습니다.
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
GameRoom에서 세션 관리에 List를 사용한 이유가 궁금합니다.
Room에 Enter와 Leave를 통해 채팅에 참여하고 나갈 수 있습니다.그리고 해당 session들을 순회하면서 모든 세션에 메시지를 보내야 합니다. 여기서 의문 사항은 참여하는 것에는 List(ArrayList)는 O(1)인데, 나가는 작업이 발생하면 자칫 O(n)이 발생할 수도 있다고 생각했습니다.이유는 해당 session을 찾는데 linear하게 순회해서 찾아내야 하고, 해당 session을 제거하고나서 빈 공간을 앞으로 당겨줘야 하기 때문입니다. 이 때문에 제 생각엔 HashSet을 사용하는 것이 좋을 것이라 생각했습니다. 혹시 List를 사용한 이유가 Enter Leave 연산보다 Broadcast가 훨씬 많이 이용되고 있기 때문에순회가 HashSet보다 List가 훨씬 빠르기 때문인가요? 언제나 양질의 강의에 감사드립니다.
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Segment와 Span의 차이
강의를 보던 중 Segment나 Span 같은 것들이 나오던데 이 둘의 차이점은 뭔가요 ?
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
파트별 학습순서
안녕하세요, 학습순서에 대해서 질문드리려고 합니다.파트 3을 완강했고,게임서버4, 디비5, 웹서버6까지 강의를 구매해놓았습니다.저는 컴퓨터공학을 전공했지만 파트4의 내용들이 꽤 어려운 것 같아서, 파트4->파트6순으로 듣는게 맞는것인지 아니면 6->4 순으로 듣는것이 좀더 좋은지, 혹은 아예 독립적인 내용인지 여쭤보려 글 남깁니다.전부 다 수강한다는 전제하에 파트 별 학습순서를 추천해주실 수 있을까요:?감사합니다!
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
교재관련
안녕하세요. 게임서버와 관련해서 C#으로 설정되는 교과서가 있을까요? 해외 원서도 좋습니다. 시중에는 C++로 기술된 교재밖에 없어서 강의 병행하기에는 애로사항이 있습니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
[에러 공유] disposeed object
args.connectedSocket을 socket으로 줄여쓰고 싶어서 이렇게 코드를 짜면 계속 disposed object 에러가 난다. 해결법 : socket변수를 따로 만들지 말고 루키스 선생님의 코드처럼 그냥 args에서 connectsocket을 가져와야된다. https://stackoverflow.com/questions/71450166/when-is-an-object-disposed-if-it-uses-using-and-it-is-being-used-in-a-few-meth 영어가 미숙해서 정확히 이해는 못했지만 { }를 나갔다가 오면 문제가 생기는 듯하다
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Dns.GetHostName()에서 'String conversion error'가 뜹니다.
Unity버전은 동일한데 방법있을까요?파일경로나 PC이름을 영어로 바꿔야할까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
_pending 을 _pendingList.Count == 0으로 대체한 것에 대한 질문입니다
_pending을 없애고 _pendingList.Cont == 0 으로 대체하셨는데pendingList.Count가 0일 때 1개의 쓰레드가 통과되고, 통과한 쓰레드가 _pendingList에 값을 추가하기 전에 또 다른 쓰레드가 _pendingList.Count == 0인가에 대한 if문에 도착하면, 그 쓰레드 또한 _pendingList.Count == 0을 무사통과하게 되지 않나요??혹시 놓치고 있는 부분이 있나요?? 항상 감사합니다~!
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
유니티로 메타버스 멀티플레이를 구현해보고싶습니다!
안녕하세요 서버에대한 지식이 전무했는데 루키스님의 강의를 들으며 많은 배움을 얻어가고있습니다.저는 유니티로 메타버스 멀티플레이까지 구현을 해보는게 목표입니다.저 혼자 알아보면서 포톤pun , fusion 같이 이미만들어진 서비스들을 알게되었습니다.메타버스 멀티플레이구현이 목표라면 서버를 만들기보다는 포톤같이 이미 만들어진 서비스를 이용하는게 좋을까요 ??물론 두 방법 모두 저에게는 어렵고 공부가 많이 필요한 상황인데 루키스님 강의를 들으며 많은 도움을 얻어가고 있어서 감사합니다