묻고 답해요
130만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Send의 Lock
안녕하세요. 항상 질 좋은 강의 감사합니다! 복습중에 이해가 안가는 부분이 있어 질문 드립니다. ServerCore의 Send부분 입니다. 제가 다음과 같이 이해를 했습니다. Send를 호출해서 Lock을 걸은 스레드가 RegisterSend를 호출하고, 여기서 pending이 true 라면 그대로 종료하면서 Lock을 풀고, 이후에 Send를 호출한 스레드는 Queue에만 담고 종료한다. 나중에 다른 스레드로 OnSendCompleted가 비동기로 호출되면, Queue를 확인해서 일감이 있다면 바로RegisterSend를 호출해서 처리한다. 일단 이렇게 이해하는게 맞는건지 궁금합니다. 만약 맞다면 Queue에 일감이 있어 OnSendCompleted를 비동기로 실행한 스레드가 RegisterSend를 호출하면, Send에는 Lock이 안 걸려있는 상태 이니 RegisterSend가 동시에 두 번 호출될 수 있지 않나요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
오류 : NullReferenceException
강의의 4:40초인 Debug.Log(Input.mousePosition); 에서는 정상 작동을 하는데 그 이후 과정인 Debug.Log(Camera.main.ScreenToViewportPoint(Input.mousePosition)); 을 입력하고 실행 시 위의 널레퍼런스익셉션 오류가 뜨네요 ㅠㅠ 어떻게 해결해야하나요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
XmlReader의 Depth에 대해서
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에서 빠져나가게 되는거 아닌가요
-
미해결
Unity ANdroid 갤러리 폴더에 파일 읽기/쓰기 질문
유니티 안드로이드 질문입니다. 유니티에서 읽기/쓰기 가능한 경로에 대해 궁금합니다. sd카드에 파일을 읽기/쓰기 하려고 하는데 경로 설정을 잘 모르겠습니다. https://stackoverflow.com/questions/39983451/unity-android-save-files-disappears-after-updating-an-app/50280071#50280071 안드로이드 10 기준으로 어떤 게 sd카드 경로를 할 수 있는지 궁금합니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
내용이 생각보다 되게 어렵네요. 학습 방법에 대한 질문을 드립니다
처음에 해당 강의를 전부 이해하고 넘어가는 것이 좋을까요 아니면 아 이런게 있나보다 하고 일단 끝까지 간 다음에 큰 틀을 대강 이해하고 여러 번 반복해서 숙달하는게 나을까요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
InputManager의 작동 원리가 잘 이해되지 않습니다.
InputManager의 작동 원리가 잘 이해되지 않습니다. 그래서 디버깅으로 한 줄 한 줄 따라가 봤는데, 여전히 궁금한 점들이 있습니다. 1. 왜 InputManager _input = new InputManager();를 읽은 뒤 Init()를 다시 실행해서 DonDestroyOnLoad(go);를 읽는 건가요? Init();은 Start에 들어 있으니 첫 실행 때 한 번 호출되고 끝이어야 하는 게 아닌가요? 2. Managers의 업데이트에서 OnUpdate를 계속 호출해 줘서 키 입력을 감지하는 건 알겠는데 키 입력이 들어온 뒤 KeyAction.Invoke();가 어떤 역할을 하는지 모르겠습니다. 혹시 InputManager에서 if( KeyAction != null)일 경우 바로 OnKeyboard()를 호출하는 게 문법적으로 불가능하기 때문인가요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
클라이언트에서 보낸 데이터가 다 도착하지 않았을 때...? 처리하는 부분이 있는건가요?
클라이언트에서 보낸 데이터가 다 도착하지 않았을 때 다음 데이터가 올 때까지 기다린 후 처리한다고 말씀하셨는데, 이 부분이 코드 어디에 구현되어있는건가요...? 위에 있는 코드를 나름대로 해석해보니 1. OnWrite()는 _recvArgs.Buffer에 들어있는 데이터만큼 _recvBuffer의 _writePos를 증가시킨다. 2. OnRecv()한 데이터(_recvArgs.Buffer에 들어있는 데이터)의 크기를 processLen에 담는다. 3. processLen의 크기만큼 _readPos를 증가시킨다. 라고 이해했는데, 클라이언트에서 보낸 데이터가 완전한지 불완전한지 딱히 판단하는 부분은 없어보이고 그냥, [1.데이터가 들어온만큼 _writePos를 증가시킨다 2. 처리한다 3. 처리한만큼 _readPos를 증가시킨다]를 실행시킨거같아서요!
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
에러가 발생합니다..
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 이러고 나서 바로 위 에러가 나버립니다. 도저히 원인을 찾을 수 없을 것 같아서 질문 남겨드립니다..
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
서버 로그 출력
서버와 클라를 실행했을 때 500명 모두가 OnConnected가 뜨지 않고 약 200 ~ 300 사이에서 서버 로그출력이 멈춥니다. (어쩌다가 한번씩은 500까지 찍힙니다.) 왜 그런것인가요? 어떻게 해결해야하나요? 리스너의 백로그를 늘려도 마찬가지네요...
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
새로운 씬을 로드 후 InputManager 문제
안녕하세요, 강의 보면서 제 게임을 만들고 있는 학생입니다. 저는 Game씬에서 퍼즐 씬으로 넘어가도록 만들고 있습니다. 그런데 여기서 MissingReferenceException: The object of type 'PlayerController' has been destroyed but you are still trying to access it. Your script should either check if it is null or you should not destroy the object. 오류가 발생합니다. InputManager에서 사용자의 키보드 입력이 들어오면 KetAction을 구독한 친구들(제 경우엔 PlayerController)에게 Invoke()를 통해 신호를 주잖아요. 그런데 새로운 씬으로 넘어가면 PlayerController가 사라지는데도 자꾸 신호를 넘겨줘서 이런 문제가 발생하는 것 같습니다. 캐릭터 이동에 할당한 키와 같은 키를 눌렀을 때 문제가 발생합니다. 이걸 해결할 수 있는 방법이 없을까요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
저 코드를 어디서 받을 수 있나요?
다 올리셨다고 했는데 어디다 올리신건지 못찾겠어요 알려주세요
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Thread의 실행순서를 잘 이해한건지 모르겠어요
처음에 메인에서 t.Start();가 Console.WriteLine("Hello World!")보다 먼저 와 있어서 제 생각에는 먼저 Hello Thread!가 먼저 찍힐 줄 알았는데, 실행해보면 Hello World!가 먼저 찍히고 Hello Thread!가 찍히더군요. 그렇다는건 이 Thread라는 일꾼은 메인이 끝난 뒤에야 실행된다는 건가요??
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
오류가 떴는데 뭐가 문제인지 모르겠어요
Assets\Script\Managers\Managers.cs(16,19): error CS0246: The type or namespace name 'UIManager' could not be found (are you missing a using directive or an assembly reference?) 이런 오류가 떴는데요 Managers 스크립트에서 UIManager _ui = new UIManager(); public static UIManager UI { get { return Instance._ui; } } 이 두 줄이 문제라고 떴습니다. 문제를 찾고 싶어서 강사님이 올려놓은 코드+정리와 비교해봤는데 도저히 못찾겠어서 질문적어봅니다.. 아래는 오류난 유니티 파일 링크입니다. https://drive.google.com/file/d/16Ayu9tOwC4CKTQcAKrsrTuPx1Sa3Rh_5/view?usp=sharing
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
웹서버와 게임서버의 활용에 관하여 질문이 있습니다.
좋은 강의 만들어주셔서 감사합니다. 정말 잘 가르쳐주셔서 너무 익혀나가고 있습니다. 다름이 아니라 혹시 웹서버와 게임서버의 활용에 관하여 질문이 개인적인 질문이 있는데 어디에 문의를 드려야 할지 모르겠어서 여기로 질문드립니다... 친구들과 같이 진행중인 프로젝트가 있는데 서버를 처음 다루다보니 AWS를 활용한 웹서버 + 클라이언트 구조로 활용하여 게임을 개발하려 하였습니다. 그런데 이제 OT에서 웹서버와 게임서버의 활용법을 얘기하셔서 저희 게임의 기획에 맞게 게임서버를 활용하기로 하였습니다. 다만, 웹서버와 게임서버를 병행하여 랭킹시스템, 유저정보 등은 웹서버를 활용하여 매치메이킹을 해주는 등에 활용하고 실제 게임이 매치되어 진행하는 동안에는 게임서버를 사용하는 것으로 구상중에 있습니다. 이제 로딩시 버전체크 등 파일 확인에도 웹 서버를 활용하면 괜찮을거 같아서 이렇게 진행을 하고 싶은데 하나의 게임 안에서 서버를 교체하여 매치를 진행한다는 것이 가능한 것인지가 궁금합니다. 저희가 아직 학생신분을 가진 상태라서 서로가 공부목적으로 진행하는 프로젝트이다 보니 웹서버에 관심을 가지고 있는 친구가 있어 포기할 수는 없는 상태인데 이게 이중연결이 진행이 되는 것인지 아니면 웹서버의 연결을 끊고 게임서버로 다시 연결시켜주는게 괜찮은 방식인가 싶습니다... 강의와는 무관한 질문 정말 죄송합니다 ㅠㅠ
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
디버깅 시작 시 오류가 뜹니다
처음부터 안된게 아니라 잘 되다가 vs를 껐다 킨 후 부터 계속 디버그 자체가 실행이 안됩니다. 코드상 문제는 아닌거같은데.. 이유를 잘 모르겠습니다 ㅠ
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
마우스 클릭 후 물리현상
마우스 클릭해서 캐릭터가 이동하는거까지 잘되는데요. 이동한 후 캐릭터가 조금씩 뜨면서 천천히 날아갑니다. Use Gravity켜면 날아가지는 않는데 어떤 힘을 받는지 천천히 앞으로 쓰러져요. Is Kinematic켜면 물리현상이 없어져서 이런게 다 괜찮아지기는하는데, 강사님 영상에서는 UnityChan이 Use Gravity랑 Is Kinematic이 체크가 안되어 있더라고요. 영상이랑 똑같이 gravity랑 kinematic 체크푼 상태에서 잘 잘작동했으면 좋겠는데. 마우스 이동 후 공중으로 천천히 올라가는걸 고치고 싶은데 어떻게 해야하나요? 코드는 다 살펴봤는데 다른 점은 없었던 것 같아요.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
Singleton 패턴 관련 문의
안녕하세요. 강의 잘 듣고 있습니다. 제가 Singleton 패턴을 잘 이해한 것인지 헷갈려서.. 아래와 같이 메모해 두었는데 제대로 이해한 것일까요? //그러니까 // Manager s_instance = new Manager(); 이게 안되니까 // go라는 GameObject를 만들어 @Managers 라는 GameObject를 생성해 집어넣던지 있으면 찾아넣던지 하고 // @Managers에 Managers클래스(스크립트)를 컴포넌트로 같다붙인 뒤 // Managers 클래스의 static instance인 s_instance에다가 // @Manager라는 GameObject에 붙어있는 컴포넌트 -> Managers 클래스를 집어넣음으로써 // 결과적으로 Managers의 static instance인 s_instance에다가 // Managers 를 갖다넣음 즉 Manager s_instance = new Manager(); 이거를 // @Managers 라는 GameObject라는 애를 통해서 우회적으로 한 것임. 감사합니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
멀티 쓰레드 질문 드립니다.
멀티 쓰레드 질문 드립니다. GameRoom 이 JobQueue를 가지고 있어서 멀트 쓰레드에서 안전하다고 하셨는데 GameRoom 의 Broadcast , Enter,Leave 등은 JobQueue 를 이용 하니 멀티 쓰레드에서 안전 한거 같은데 GameRoom 의 Flush 는 어떻게 안전 할수가 있나요?
-
미해결
유니티 초보 질문입니다ㅠㅠㅠ
유니티 특정 폴더의 mp3 파일들을 리스트로 보여주는 리스트 뷰 만드는 방법 궁금합니다. 안드로이드 디바이스 특정 폴더에 mp3파일이 여러 개 있는 경우에 전체 경로와 파일명을 같이 보여줄 수 있도록 하고싶은데 디바이스의 특정 폴더 접근과 리스트 뷰에서 프리팹을 어떻게 만드는지 몰라서 계속 막힙니다;;
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
패킷모아보내기 실습 보내는 갯수가 500으로 안떨어지는경우
더미클라이언트 수를 500으로 설정하고 실행 했을때 500으로 유지되지는 않고 267 정도로 계속 보내게 됩니다. 프로세스 메모리는 일정하게 유지가 되구요. 이런경우 프로세스 성능에 따라서 모아보내기가 적게 자주 보내게 될수도있나요? 예를 들어 while에서 패킷을 모아보내는 수가 500이 안차더라도 보낼수 있는건가요?