묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결따라하면서 배우는 고박사의 유니티 기초
2021년도 버전으로 알려주세요 ㅠㅠ
몇년 전 꺼랑 현재꺼랑 달라서 하기가 힘들고 알아듣질 못하겠어요 ㅠㅠ 사진 놓는법도 서로 다르고요 ㅠㅠ 현재는 그냥 화면레 올리면 나타나는데 그것도 모르고 고박사님처럼 하려다 안됐어요 ㅠㅠ
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
멀티스레드 와 Lock 질문
안녕하세요. 항상 양질의 강의 감사합니다! 복습중 이해가 확실히 안되는 부분이 있어 질문드립니다. 서버에서 다양한 곳에서 Player를 이동시킬 수 있기 때문에(다른 플레이어가 스킬로 Player를 밀쳐내는 등..) Player를 이동시키는 부분은 한 곳에 몰아서 Lock을 걸고 실행시켜 준다고 설명해 주셨습니다. 그래서 위처럼 GameRoom에 Player가 움직이는 로직을 몰아서 Lock을 걸어주셨는데, 제가 궁금한 점은, HandleMove멤버함수에서 특정 Player를 참조(?) 하고있는 인자 player를 가지고 Lock을 걸고 작업을 하고 있을 때, 다른 클래스의 맴버함수에서도 똑같은 Player를 참조해서 Lock을 걸고 작업하려고 한다면 Lock이 걸리나요? Lock을 건다는건 메모리상에 실제로 생성된 객체(?)를 기준으로 걸리는 건가요? 설명이 많이 미흡한 점 죄송합니다 ㅜ.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Unity 실행이 안됩니다..
NetworkManager 에 script를 추가하고 실행을 하면 Unity가 멈춥니다. NetworkManager를 빼고 실행하면 실행이 되는데 뭐가 문제인지 잘 모르겠네요.. 노트북으로 실습하고 있습니다.
-
해결됨[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 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
해당 강의 영상의 해상도가 너무 낮네요.
인프런의 오류인가요?ㅠㅠ 눈이 너무 아픕니다.
-
미해결[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 게임 개발 시리즈] Part4: 게임 서버
소켓에 바로 메세지를 보내는게 아니라 버퍼를 만들어서 넣어주고 주고받는 이유가 있나요?
수신과 송신 버퍼를 둘 다 가지고 있고 거기에 일단 메시지를 넣어서 보내거나 버퍼를 통해서 받고 있는데 버퍼를 사용하는 이유가 소켓이 바로 메세지를 받지 못하고 대기하는 경우나 병목이 있을 경우를 대비해서 그런건가요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
Scene 전환시 데이터 유지와 설계 질문
안녕하세요 ㅎㅎ 강의를 들으며 토이프로젝트로 조그마한 게임을 하나 만들고 있습니다. 몇 가지 궁금한 점이 생겨 질문드립니다. Q1.1) 아래 사진은 루카노르 백작 이라는 게임입니다. 캐릭터가 위의 문을 열고 들어가면 빌런인 염소가 존재합니다. 문제는 이 방을 나갔다 새로 들어와도 염소의 자리는 그대로 방을 나갈 당시 위치에 있습니다. 게임을 해본 추억을 되짚어 보니 두 가지로 나뉘더군요 1) 방을 나갔다 다시 들어오면 몹이 초기 젠 자리로 가있는 경우 2) 방을 나갔다 들어와도 아래와 같이 몹이 그자리 그대로 있는경우 1)번의 경우 모든걸 초기화하고 새로 만들면 될 것 같은데 2)번의 경우 기존의 정보를 어떤 방식으로 관리하는지 궁금합니다. 만약 던전의 방도 Scene으로 관리한다면 본 강의의 예제에서는 Scene간의 전환시 Manager를 통해 clear하는데 어떤식으로 코드를 수정해야할지 여쭙고싶습니다. 횡설수설하지만 정리해서 말씀드리면.. Scene전환시 이전 Scene으로 돌아갈때 이전 Scene의 상태를 그대로 유지한상태로 돌아가는 방법은 무엇인가요? Q2) 또 한가지 의문은, 리니지나 디아블로의 경우 던전의 한 층 자체를 Scene으로 관리할 것 같은데 아래와 같이 던전 내에 여러개의 문이 있고, 문에 입장하면 장면이 전환되는 경우 던전 내의 방들은 Scene으로 관리하나요? 설계는 개발자 마음대로라지만 Rookiss님이 게임을 만드신다면 어떻게 설계하실지 궁금합니다.
-
미해결[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 게임 개발 시리즈] Part3: 유니티 엔진
매핑 단어 뜻
강의중간중간 매핑이라는 단어가 나오는데 코드를 보고 구글링을 해도 정확한의미를 잘 모르겟어서 질문드립니다 ㅠ
-
미해결[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: 게임 서버
job queue 흐름에 관하여 질문있습니다
안녕하세요 항상 좋은 강의 잘 듣고 있습니다. 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수행 시간만큼 늦게 보내게 되는 것인데 뭔가 불합리?하다고 느껴집니다. 이런 정책을 많이 사용하나요?
-
해결됨[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: 게임 서버
Buffer와 Packet에 관한 의문
안녕하세요 ㅎㅎ 강의를 들으며 세세한 것 보다 전체적인 흐름을 잘 이해하려고 노력중입니다. 몇 가지 흐름을 파악하다 의문이 생겨서 질문 드립니다. Q.1 PacketSession 클래스의 OnRecv함수입니다. while문의 첫번째 if문을 보면 일단 헤더의 size는 파싱할 수 있는지 체크를 하고 있는데요, 잠시 TCP의 성질을 보면 TCP통신의 경우 혼잡제어를 통해 서버가 혼잡하면 일부만 보내고 다시 원활해지면 나머지를 보낸다고 하셨습니다. 그렇다면 혼잡시에 패킷의 일부만 전송되어 SIZE만 보내진다거나 헤더를 제외한 데이터만 전송되는 경우도 있나요? 일부만 전송한다는 얘기가 패킷단위로 나눠서 보낸다는 말이지 패킷을 쪼개서 보내지는 않는다는 뜻인건가요? Q.2 100명의 유저가 같은 장소에서 모두 움직이면 10000개의 패킷이 전송될것이고, Send를 호출하는 부분이 데이터 복사와 같은 무거운 작업들이 많이 일어나니 컨텐츠단에서 SendBuffer라는 대용량 버퍼를 만들고 거기에 차곡차곡 넣어서 유저당 한번씩만 전송하도록 하여 총 100개의 패킷만 전송하도록 하는 것이 목적인가요? 제대로 이해했는지 아리송합니다 ㅠㅠ Q.3 SendBuffer 클래스가 있고 사용하기 편하게 인터페이스를 뚫어준 SendBufferHelper 클래스가 있는데 애초에 SendBuffer를 사용하는 쪽에서 편하게 인터페이스를 뚫어줄 수도있는데 별도 SendBufferHelper클래스를 사용하시는 이유가 있나요?!! 선생님처럼 Helper Class를 작성하면 단기적으로, 장기적으로 어떤 이점이 있는지 궁금합니다. 아직 이와같은 설계가 너무 낯설어서 많이 배우고 알고싶습니다! Q.4 SendBufferHelper에서 Open시 요구한 사이즈보다 버퍼 여유공간의 크기가 작으면 new 를 통해 새로운 버퍼를 할당하게 되는데요 이전에 사용하던 버퍼는 누군가 잘 사용하다가 더이상 참조가 없어지면 가비지 컬렉터에 의해서 메모리 정리가 잘 되는건가요? 너무 쿨하게 new로 새로운 메모리 공간을 할당해서 조금 의문이 생기네요. SendBuffer의 경우 전송후에 더이상 참조할 일이 없기에 가능한 Send만의 특징이겠죠?