월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
안녕하세요. static 질문요
제가 왕초보라.. 좀 헷갈려서여... 유니티에서 코드 짤때는 static을 메니저같은곳.. 싱글톤 같은곳에서... 쓰고 웬만해선 잘 안쓰는 거로 아는데 서버편같이 유니티말고 그냥 코드 짤때는 static을 웬만한곳에 다 붙이던데.. 다른 경우인가여? static Listener _listener = new Listener(); 이경우에도 유니티같은경우 static을 안 쓸텐데 여기서는 안쓰니까 에러가 나더라고요.. static void Main(string[] args){} 이런식으로 메인에도 static이 있고... 유니티에서 코드 짜는거랑 걍 c#이랑 좀 다른건가여?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
질문이 있습니다
System.Xml.XmlException: 'The 'list' start tag on line 7 position 6 does not match the end tag of 'packet'. Line 14, position 5.' 이 오류가 무슨 뜻인지 모르겠습니다
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
패킷 하나의 멤버변수만 바꾸고 싶어도 패킷 전체를 보내야하나요?
예를 들어, 패킷 안에 들어있는 멤버변수 level만 1 증가시키고 싶습니다. 그러면 C_PlayerInfoReq 라는 큰 용량의 패킷을 하나를 보내야하나요? 아니면 send(int packId, int offset, int desired); 처럼 packid만 송신해서 level 주소에 접근하는 방법이 있을까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
null 오류
선생님 강의를 보며 코드를 똑같이 작성했는데 널 리퍼런스 오류가 디버깅 도중에 뜨면서 GenPacket.cs가 만들어지지 않아 진도를 못나가고 있습니다 genPackets += string.Format(PacketFormat.packetFormat, packetName, t.Item1, t.Item2, t.Item3); 이 코드에서 널 리퍼런스 오류가 뜨면서 디버깅이 중단됩니다 정확히는 t가 널이었다면서 오류가 뜹니다
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
빨간줄이 안없어지는 거에 대해서 질문 있습니다.
안녕하세요 강사님 다름이 아니라 23분 영역에 패킷핸들러를 작성하는 부분에서 이제 S_BroadcastLeaveGame을 작성할때 빨간줄이 없어지질 않습니다. C_ 패킷은 써도 아무 문제가 없지만 유난히 S_이 붙어 있는 것에는 빨간줄이 없어지질 않습니다. 몇시간동안 코드를 뒤져보던중 Genpacket 부분에서 S_부분에 마우스를 갔다 댔는데 명명규칙 위반이라고 뜹니다. 혹시 이것때문에 packethandler 에서 S_ 으로 시작하는 패킷을 인식하지 못하는 것일까요? 혹시 짚이는 것이라도 있습니까?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
socket이 null이라고 뜹니다
안녕하세요 강사님 좋은 강의와 친절하신 설명에 감사드립니다. 그런데 강의를 실습하던도중 문제가 생겨 질문드립니다. 이렇게 send를 하면 socket이 null로 뜨더군요 비슷한 질문이 이미 있길래 그것을 참고로 해결해 보려했지만 왜 null이 뜨는지 모르겠네요
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
서버에서의 Send
안녕하세요 강사님 항상 신속하고 정확한 답변에 다시한번 감사의 말씀드립니다. 다름이 아니라 여태 작성한 코드를 이해하기 위해 읽어보던중, 서버에서 클라로 데이터를 보내 Hello server! i am 10 과같은 정보들이 뜨는 과정을 이해하려 했습니다. 보면 Server program에서 GameRoom을 static 으로 받아서 안에 있는 코드가 실행된거 같은데 맞나요? 매번 강의 들으면서 코드를 이해하려고 노력하고 있습니다. 일단 기초가 너무 없어서 흐름이라도 알아야 나중에 뭐라도 할수 있을것 같아서요. 볼때마다 각각 클래스마다 조직적으로 깔끔하게 분리되어 아름답게 동작하는 느낌이 들지만, 읽고 이해하려고 보면 정말 머리가 아프고 어렵네요... ㅠㅠㅠ
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
해당 강의에서 사용한 비쥬얼 스튜디오 관련해서요
혹시 visual studio 폰트를 어떤거 쓰시나요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Lock(_obj) 이라는 키워드에 질문있습니다.
1. Lock(_obj) 이라는 키워드는 C++에서도 사용이 가능한가요? 2. using System.Treading.Task 를 선언해야 쓸수 있는건가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
코드 재배치 부분에서 질문이 있습니다.
HW가 마음대로 코드를 재배치 한다는 부분이 흥미로웠는데요, 실제로 코드를 재배치하는 주체가 누구인지 궁금합니다. 컴파일러인지 아니면, 다른 누가 재배치를 건드는 걸가요? HW라고 표현 하신게 너무 포괄적으로 들려서 이해가 잘 안됐습니다 ㅠ
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
21:40 부분처럼 리스트랑 구조체가 생성되질 않습니다. ㅠㅠ
안녕하세요 강사님 저 그때까지 강사님 코딩대로 따라 쳐보고 이해하는 식으로 해봣는데요 21:40 처럼 public struct Attribute가 나오질 않아서요 일단 제 생각에 packetformat에서 문제가 있을 거 같아서 조사해봤지만 잘 모르겠네요.... 혹시 제 코딩을 보낼 수 있다면 보내겠습니다. 감사합니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
패킷 직렬화 부분
▶ 패킷 구조를 다음과 같이 만들었습니다. ▶ 강의에서는 C_PlayerInfoReq클래스 List용 내부클래스에 매개변수로 string이나 byte를 사용하지 않아서 한번 넣어서 사용해 봤습니다. ▶ 그런데 string이나 byte는 write 자동화 부분을 만들때 ArraySegment<byte> Segment를 사용하여 이렇게 만들고 있는데 List용 write메서드는 매개변수로 Span만을 받아서 사용하고 있더라구요 ▶ 그래서 그냥 ArraySegment<byte>로 매개변수를 통일하고 그안에서 다시 Span변수를 만들고 사용하고 있습니다. ↓ ▶ 일단 작동하는 데에는 문제가 없는듯한데 string의 길이를 받아오는 부분을 Span을 사용해서 만들 수 있을까요? (마지막 이미지의 마지막줄 부분) 감사합니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
패킷조립순서
강의도 보고 다른분들 질문도 보고 있습니다. void RegisterRecv() { _recvBuffer.Clean(); ArraySegment<byte> segment = _recvBuffer.WriteSegment; _recvArgs.SetBuffer(segment.Array, segment.Offset, segment.Count); ... } 불완전한 패킷은 조립가능할때까지 기다렸다가 조립해서 해석하는 것까지는 알겠는데, 어디서 모아놓는지 헷갈려서 복습을 하면서 찾아보았습니다.위의 RegisterRecv메소드의 _recvArgs.SetBuffer에서 Recv데이터를 모아놓는게 맞나요?①여기서 처리가능하면 처리후 _recvBuffer.Clean()을 통해 위치를 처음으로 돌려주고 ②처리가 불가능하다면 계속 기다리다가 다음 패킷이 오면 현재의 _readPos, _writePos 기준으로 다음 데이터를 받아서 처리- 맞게 이해했을까요? 그리고 만약에지금 RecvBuffer의 크기가 1024인데 800짜리 패킷이 400만 도착해서 대기중입니다.그때 다음 패킷이 잘린 400+새 패킷 800 해서 1200이 들어와 버리면 => 400짜리 패킷(a-1)+400짜리 패킷(a-2)+800짜리 새 패킷(b)이렇게 될텐데,1024를 넘어 버리게 들어오면 어떻게 되나요? 애초에 이렇게 들어올 수 있을지는 모르겠지만;;(잘린 패킷이 다음패킷에 붙어서 올수가 없나요?)
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
애매한 질문
루키 강사님 제 질문이 잘 이해가 될지 모르겠습니다만, 일단 제가 궁금한것은 일단 이번 강의에서는 dummyclient랑 servercore랑 같은 컴퓨터에 실행하면서 서로 dns와 아이피주소를 이용해 정보를 간단하게 주고 받았는데 만약에 인터넷이 연결돼있는 컴퓨터 2대가 있을때 하나는 우리가 만든 dummyclient 파일을 가지고 있고 다른 하나는 servercore를 가지고 있을때 이때 servercore를 먼저 실행시키고 그 다음 dummyclient를 실행시키면 둘다 정보를 주고 받을 수 있나요? 일단 제 개인적인 생각으로는 안될거같은데 그래도 궁금해서요.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
메모리 베리어 강의 중 18:40초 쯤 메모리 베리어 4에 대한 질문
18:40초 쯤 메모리 베리어 4에 대한 질문입니다. 메모리 베리어 3번째에서 _answer = 123과 _complete = true라는 2가지 정보를 다 가져온 것 아닌가요? 따라서 메모리 베리어 4가 없어도 잘 동작해야 하는 것 아닌가요? 그렇다면 메모리 베리어 4는 필수라기 보단 혹시 answer에 대한 정보가 빠졌을 수도 있으니(메모리에 안 올라왔을 수도 있으니) answer를 사용하기 전 가장 최신 정보를 다 가져오라는 차원에서 작성해 준 것인가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
19:10초 부분 질문있습니다!
public override void OnDisconnected(EndPoint endPoint) { SessionManager.Instance.Remove(this); if (Room != null) { GameRoom room = Room; room.Push(() => room.Leave(this)); Room = null; } }===========================================여기서 푸쉬를 하는건 주문서에 적고 주방에 밀어넣는것인데 만약에Room.Leave()를 큐에 넣고, Room = null로 바꿀시Room.Leave()는 큐에서 대기하느라 실행도안되었는데null로 값이 바뀐상태여서 Room이 null값 에러가 나는것인가요? 그래서 Room의 주소값을 참조하는 room을 만들어room을 큐에 밀어넣어주고 , Room을 Null로 바꾸어도큐에 대기하다가 함수처리를할때 Room을 참조하는 room함수를 실행하기에, Null에러가 안나는것으로 이해했습니다제가 옳게 이해한것이 맞을까요?
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
RegisterAccept() 질문
우선 먼저 사과드립니다... 비슷한 질문이 많은데 그 글들을 봐도 이해에 대해 확신이 서지 않아 같은 질문을 또 드리는것 같네요. 의문이 있는 부분은 SocketAsyncEvnetArgs 부분 입니다. 1. RegisterAccept 에서 AcceptAsync로 args를 처리. 2. args안에 EventHandler<T> Completed; 존재 3. args안에 OnCompleted가 존재하고, Accepted되면 OnCompleted가 실행되면서 Completed.Invoke로 OnAcceptCompleted 동작. 비동기로 accept를 처리하고, accept가 완료되면 callback을 통해서 OnAcceptCompleted 함수가 수행된다는 개념은 이해했지만 동작 메커니즘이 정확하게 이해되지 않아 질문드립니다. 아래 사이트를 참고하였을때, OnCompleted에 뭔가 정의가 있어야 함수가 실행이 될텐데요, event - C# 참조 | Microsoft Docs EventHandler<TEventArgs> 대리자 (System) | Microsoft Docs VS2019에서 정의를 타고 올라갔으나....주석 뿐인 정의만 있었습니다. Socket까지도 정의를 타고 올라갔는데 마찬가지로 프로퍼티+주석만 잔뜩있었습니다 ㅠㅠ.... 제가 옳게 이해한 것이 맞을까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
ReadWriteLock 부분 질문
ReadWriteLock강의 27분 즈음 이 부분에 대한 질문입니다. static volatile int count=0; 에서 volatile을 쓴 이유에 대해 궁금합니다. 앞서 컴파일러 최적화 강의에서 코드 재배치를 막기 위해 매 번 메모리를 참조해서 새 값을 가져오라는 뜻으로 volatile을 붙여준다고 이해했는데요, 위 코드에서는 없어도 무방한거 같아(volatile 없이 100,000번 실행시 0이 나옵니다.) volatile을 사용한 이유에 대해 질문드립니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
시간 복잡도 관련 질문입니다
안녕하세요. 강의를 수강하던 와중에 궁금한 점이 생겨 질문드립니다. 서버에서 packet 관련 로직을 처리하는데 n^2가 소요된다고 들었던 것 같습니다. 예를 들면 n개의 client에서 각각 1개의 packet을 받을 경우 1. for(packet in packets){ result = handlePacket(packet) for (client in clients){ sendPacket(result); } } 이런 식으로 n^2이 되는 것 같은데 패킷을 모아서 처리하게 된다면 2. for(packet in packets){ result = handlePacket(packet) } for (client in clients){ sendPacket(result); } 이런식으로 n+n이 되는거 아닌가요? 또한 2와 같은 방식으로 코드를 짜시지 않은 이유가 궁금합니다. 2와 같은 방식이 불가능한건가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
9분 50초부분부터 궁금한게 있습니다
ushort nameLen = (ushort)Encoding.Unicode.GetByteCount(this.name); succes &= BitConverter.TryWriteBytes (s.Slice(count, s.Length-count), nameLength); count += sizeof(ushort); Array.Copy(Encoding.Unicode.GetBytes(this.name), 0,segement.Array,count ,nameLength); count += nameLength;========================================== 저는 변수 count의 용도를실제 패킷의 사이즈 가늠용도로 파악하였고그래서 패킷의 다음 속성 데이터가 들어올떄 count인덱스부터 들어가면 되겠다라고 이해했습니다배열을 복사하고 스트링데이터가 버퍼에 들어갈 공간을 설정후, 그만큼 공간을 차지하게 되니count += nameLen(스트링길이) 더하는건 이해가 가는데 (질문)그전에 스트링을 인코딩으로 바이트배열로 바꾸고 count += sizeof(ushort) 하는 이유가 잘 이해가 안가서 질문드립니다혹시 인코딩 과정자체도 패킷의 사이즈가 늘어나는것인가요?