묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[실전 게임 코드 리뷰] 유니티 클리커 게임
IAPManager 에러
파일을 다운받고 게임을 실행하니 Assets\Scripts\Manager\IAPManager.cs(9,27): error CS0535: 'IAPManager' does not implement interface member 'IStoreListener.OnInitializeFailed(InitializationFailureReason, string?)' 위와 같은 에러가 뜨네요. 유니티 버전은 2021.3.21f1입니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
SendBuffer 새로 sendbuffer 할당해주는 문제
public static ArraySegment<byte> Open(int reserveSize) { if (CurrentBuffer.Value == null) { CurrentBuffer.Value = new SendBuffer(ChunkSize); } if (CurrentBuffer.Value.FreeSize < reserveSize) { CurrentBuffer.Value = new SendBuffer(ChunkSize); } return CurrentBuffer.Value.Open(reserveSize); }Sendbuffer에서 남은버퍼를 반환해주는 open함수에서 필요한 사이즈가 현재 남아있는 free사이즈보다 큰 경우(CurrentBuffer.Value.FreeSize < reserveSize) 새로 sendbuffer를 CurrentBuffer.Value에 넣는데, 아직 CurrentBuffer.Value 에 보내지 못한 데이터가 있는 경우에 open을 해버리면 새 sendbuffer가 CurrentBuffer.Value로 치환되어버려서 데이터가 날라가버리는 것 아닌가요? 즉, 예를들어 아직 100명한테 다 안보냈는데 새로 할당해버리면 안되지않나요? _usedSize를 recvbuffer에서처럼 땡겨서 쓰지 않는 이유가 누군가가 계속 이전에 있던 부분(현재 사용 중인 부분)을 참조하고 있을 수도 있기 때문에 그냥 증가시키는 방법으로 한 것 처럼.. CurrentBuffer.Value 도 저렇게 그냥 새로 할당해버리면 안될 것 같다고 생각이 계속 듭니다 ㅜㅜ
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
SendBuffer 마지막부분 이해가 안됩니다.
질문 1. TLS로 SendBuffer를 스레드별 전역변수로 지정했으면, SendBuffer 멤버필드인 buffer도 스레드별 전역변수가 아닌가요?그런데 왜 _buffer는 공유자원처럼 다수의 스레드가 참조하는 건가요?(28:39 부분) 질문 2. 만약 _buffer는 TLS 여도 다수의 스레드가 볼 수 있다고 쳐도, 어차피 Send하는 부분은 그 스레드가 넣은 부분만(handler에서 close로 보내준 segment영역) 보내주기때문에 상관없는 것 아닌가요? (하지만 애초에 질문 1이 이해가 안됩니다.) 질문 3.이전에 Session#2 강의 시작부분에 설명해주신 내용에서,SEssion의 receive는 OnRecvCompleted()메서드에 여러 스레드가 동시다발적으로 들어가는 경우는 없다. 라고 하셨는데, 해당 강의에서는 어떤 이유로 멀티스레드를 생각해야 하는 상황이 된건지 궁금합니다.질문 4.Session 객체는 connect되는 client당 하나씩이니까 client와 연결 될 때 마다 새로운 session객체가 생성되어 다 따로 만들어지는 것이기 때문에 애초에 _sendQueue도 스레드별로 따로 아닌가요? 질문 5. _buffer는에서 읽기만 하는거니까..(30:03) 라고 하셨는데 읽는 부분이 어느부분인지, deq하는것을 읽는것이라고 표현하신건가요? 어떤 경우들을 말슴하시는건지 이해가 안되어 헷갈리는게 많습니다. 일단 질문은 더 있지만, 대표적인 질문들로 올려봅니다
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
LayerMask를 사용하면 왜 최적화가 되는지 잘 이해가 되지 않습니다.
LayerMask를 통해 RayCasting을 하면 하지 않았을 때보다 최적화가 된다고 하셨는데 왜 그런지 잘 이해가 되지 않습니다. 혹시 더 자세하게 알려주실 수 있나요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Session #2 내용중 왜 스레드가 동시다발적으로 접근 불가능한지 질문
Session#2 강의 시작부분에 설명해주신 내용에서, SEssion의 receive는 OnRecvCompleted()메서드에 여러 스레드가 동시다발적으로 들어가는 경우는 없다. 라고 하셨는데, 왜 그런지 이해를 못했습니다. ServerCore의 OnAcceptHandler는 콜백함수라서 콜백함수는 다른 스레드가 생겨나서 실행이 된다고 들었던 것 같은데, 그렇다면 두 스레드가 OnAcceptHandler에서 Session.Start()를 해버리면 OnRecvCompleted()메서드를 두 스레드가 동시에 실행할 경우가 생기지 않나요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
listener, session 간의 차이
안녕하세요, listener, session 코드간 차이점에 대해서 질문이 있습니다. 1, listener에서는 OnRecvCompleted()와같은 메서드에서 socketerror가 발생했을 때, disconnect를 하지 않았는데, session에서는 왜 disconnect를 하는 건가요? 2.listener 에서는 registerRecv() 와같은 함수를 OnRecvCompleted의 if, else와 상관없이 실행한거같은데, 왜 session에서는 if(args.Bytes.Transferred > 0 && ~~~) 을 만족해야 OnRecvCompleted를 실행하는건가요? using System; using System.Collections.Generic; using System.Net.Sockets; using System.Text; namespace ServerCore { class Session { Socket _socket; public void init(Socket socket) { _socket = socket; SocketAsyncEventArgs recvArgs = new SocketAsyncEventArgs(); recvArgs.Completed += new EventHandler<SocketAsyncEventArgs>(OnRecvCompleted); //userTocken으로 추가적인 정보를 아무거나넘겨줄 수 있다(object를 받기 때문) recvArgs.SetBuffer(new byte[1024],0,1024); RegisterRecv(recvArgs); } void RegisterRecv(SocketAsyncEventArgs args) { args.AcceptSocket = null; bool pending = _socket.ReceiveAsync(args); //바로 성공했으면 if(pending == false) { OnRecvCompleted(null, args); } } void OnRecvCompleted(object obj, SocketAsyncEventArgs args) { //BytesTransferred == 몇바이트 받았는지 if (args.BytesTransferred>0 && args.SocketError == SocketError.Success) { try { string recvData = Encoding.UTF8.GetString(args.Buffer, args.Offset, args.BytesTransferred); Console.WriteLine($"[from client] : {recvData}"); RegisterRecv(args); } catch(Exception e) { Console.WriteLine($"onrecvcompleted failed {e}"); } } else { //TODO Disconnect } } } }
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Listener, Session 에서의 콜백메서드 질문
안녕하세요, listener, session 클래스를 구현할 때, 콜백메서드에 대해 질문이 있습니다. 아래와 같은 코드에서, using System; using System.Collections.Generic; using System.Net.Sockets; using System.Text; namespace ServerCore { class Session { Socket _socket; public void init(Socket socket) { _socket = socket; SocketAsyncEventArgs recvArgs = new SocketAsyncEventArgs(); recvArgs.Completed += new EventHandler<SocketAsyncEventArgs>(OnRecvCompleted); //userTocken으로 추가적인 정보를 아무거나넘겨줄 수 있다(object를 받기 때문) recvArgs.SetBuffer(new byte[1024],0,1024); RegisterRecv(recvArgs); } void RegisterRecv(SocketAsyncEventArgs args) { args.AcceptSocket = null; bool pending = _socket.ReceiveAsync(args); //바로 성공했으면 if(pending == false) { OnRecvCompleted(null, args); } } void OnRecvCompleted(object obj, SocketAsyncEventArgs args) { if (args.SocketError == SocketError.Success) { string recvData = Encoding.UTF8.GetString(args.Buffer, 0, args.Buffer.Length); Console.WriteLine($"[from client] : {recvData}"); } else { Console.WriteLine(args.SocketError.ToString()); } RegisterRecv(args); } } } 해당 RegisterRecv()메서드에서 pending이 false인 경우 바로 OnRecvCompleted()를 호출해주는거고, true인 경우 콜백메서드로 OnRecvCompleted가 호출되는 형식이라고 이해를 했는데, void RegisterRecv(SocketAsyncEventArgs args) { args.AcceptSocket = null; bool pending = _socket.ReceiveAsync(args); //바로 성공했으면 if(pending == false) { OnRecvCompleted(null, args); } }그렇다면, pending이 false인 경우에는 if(pending == false) { OnRecvCompleted(null, args); }여기서 OnRecvCompleted() 호출되고 또 콜백메서드에서 또 한번 호출되는 것 아닌가요? 콜백메서드가 false인 경우에 2번호출되지 않는다는 것을 어떻게 이해하면 될까요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
제네릭 타입 질문
학습중에 클래스를 제네릭으로 받으면 어떻게 될까 궁금해 한번 받아봤습니다!우선 필요한 정보를 받아올때 json 파일마다 역직렬화 & 직렬화 용도의 클래스가 다르기 때문에해당 부분을 public IEnumerator CoDownLoadJsonData<T>(string URL) where T : class { UnityWebRequest request = UnityWebRequest.Get(URL); yield return request.SendWebRequest(); // 에러 발생 시 if (request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError) { Debug.Log(request.error); } // 에러 없을 시 else { // S3의 JSON 파일 읽어와서 넣어주기 T[] jsonDatas = JsonConvert.DeserializeObject<T[]>(request.downloadHandler.text); // 그 뒤 값 처리 해주는 부분 foreach (T jsonData in jsonDatas) { // TEMP Debug.Log(무슨 값을 넣어야 할까요); } } }이렇게 짜봤습니다. 위의 함수를 실행 할 때 넣은 T 값은 public class JsonData{ public string name; public int coin; public int ruby;}JsonData라는 클래스 입니다.그리고 다운로드 받은 json 데이터의 name 값을 보기위해 '무슨 값을 넣어야 할까요'부분에 jsonData.name을 쳐보았지만 타입이 제네릭이라 받기전까지 name이 있나 없나를 알 수 없기 때문에 당연히 해당 코드는 에러가 났습니다. 이러면 파싱 받을 json 데이터 마다의 클래스를 따로 분기해서 처리해줘야 한다는 말인데 제네릭 타입을 이용하여 루키스님 처럼 우아?하게 코드를 짜보고 싶은 생각이 드네요. 방법을 못 찼겠어서 질문드립니다!!현재 저의 머리로는 제네릭으로 만든후 안에 조건문을 추가해서 as 로 파싱되면 그쪽으로 처리하는 분기문을 만드는게 한계인거 같네요 ㅠㅠ값은 정상적으로 받아와집니다만 브레이크 포인트를 통해서 값을 확인하는 것이 아니면 확인이 안되네요 ㅠㅠ
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
환경설정 질문입니다
안녕하세요 선생님, 제가 새 프로젝트를 만들면서 이름과 위치를 정하고 다음으로 넘어갔더니 대상 프레임워크에 .NET Core 3.1 (지원하지 않음) 이라고 나옵니다.visualstudio installer에서 제가 보기에 c#에 관련된 것은 다 설치한 상태인데 더 설치해야 하는 것이 있는걸까요?
-
미해결유니티 머신러닝 에이전트 완전정복 (기초편)
karting asset
karting asset을 다운 받아서 OvalTrack을 화면에 추가하려고 하는데 트랙 모양이 왜 이렇게 뜨는 건가요?asset을 지우고 다시 설치해도 똑같아요
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
싱글톤패턴에서 질문
18:25쯤에 public static Managers instance {get{init(); return s_instance;}}로 함수에서 프로퍼티로 바꿔서 ()없이 가져오기 편하게 바꾸셧는데 이떄 {}안에 init();을 넣은 이유는 안넣으면 return s_instance;할때 오류가나서 그런가요? 이유를 알고싶어요
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
안녕하세요 강의 시청중 궁금한점 생겨서 질문드립니다.
소켓 프로그래밍 예제들을 찾아보다가 아래의 사진처럼 await/async 비동기 방식으로 소켓프로그래밍 하는 예제를 보았는데요, 강의에서 사용된 소켓 프로그래밍 코드와 await/async 비동기 방식을 사용한 소켓프로그래밍 코드의 차이점(생산성, 속도 등등)이 궁금합니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
client에서 send시에 sendBuff 출력방식 문의(강의20분경 연결테스트중)
20분쯤 테스트 진행시에client에서 sending한 sendbuff내용이첫줄은 hello world 1회반복두번째 통신은 hello world 4회반복이후 통신은 hello world 5회 반복이 고정되어 통신되는데반복문 알고리즘을 이해하지 못한건지 정확한 메커니즘을 알고싶습니다. 너무 기초적인 질문일 수 있지만 답변 부탁드려요;;
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
배운것을 활용하여 프로젝트를 하다가 궁금한것들이 생겼습니다.
현재 강의에서 배운 내용을 활용하여 rpg게임을 개발하고 있는데 궁금한 것들이 생겨 질문하게 되었습니다.맵을 만들면서 맵에 있는 잔디나 나무들 때문에 렌더링 해야 될것들이 많아져 이를 어떻게 해결해야 될지 잘 모르겠습니다. 일반적인 경우에는 오브젝트의 거리별로 해당 오브젝트를 렌더링 할지 말지를 정하는걸로 아는데 이를 구현하는 방법을 잘 모르겠습니다.적들이 쫓아 올때 적들이 겹치거나 서로 밀리는 현상이 있었습니다. 그래서 navmeshagent에서 적들의 이동 우선순위를 결정 해주고 radius를 줄여보았지만 자연스럽게 되는게 아닌 옆으로 조금씩 밀리면서 되거나 몇마리는 앞에 있는 몬스터들에게 끼여 있는 현상이 생기더군요 이를 어떻게 해결해야될지 답변해주시면 감사하겠습니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
에셋 분홍색으로 뜰때 해결방법
Shader를 Standard로 바꾸기 이걸로 많은 분들이 해결되기를 바랍니다
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
모바일 2d 캐쥬얼 게임
Rookiss 님을 멘토 삼아 게임 개발을 위해 달리고있는 청년입니다 ! 모바일 2d 캐주얼 게임 제작을 목표로 두고있는데 ,결제와 관련된 중요한 장비나 캐릭터 정보같은건 서버에서 처리할까요? 혹시 서버를 따로 공부 해야한다면 루키스님 강의중 게임서버 , 웹서버 둘중 어떤걸 들어야할까요??
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
공부 방법에 대해서 질문이 있습니다
안녕하십니까 게임 프로그래머 취업 가이드 영상을 보고 클라이언트쪽만 공부하다가 서버 공부를 시작하려고 하는 대학교 2학년생입니다.유니티와 언리얼강의 전체를 한번씩 보면서 어떤 느낌인지 파악하고 이해 안되는 강의를 계속 돌려보는 식으로 공부하려고 했습니다. 근데 제가 유니티 c#, 알고리즘, 엔진을 들을때는 괜찮았는데 게임서버 강의를 이제 1번 완강했는데 거의 부분적인 이해만 한것같고 전체의5%정도밖에 이해를 못했습니다.. 이게 다음파트로 넘어가는게 맞을까요? 아니면 이해갈때까지 서버강의를 계속 들어야할까요?조금이라도 이해가 더 될까봐 한빛아카데미 데이터 통신과 컴퓨터 네트워크 박기현 지음 이 이론책을 같이 보면서 공부중인데 이 두꺼운 이론책을 봐도 이 강의와의 접점을 못찾겠고 봐도 이해가 잘 안가는데 보는게 맞을까요? 아니면 시간낭비일까요..?강의 듣는 순서도 고민이 됩니다 유니티 강의보다 c++ 강의와 c++ 서버 강의를 듣고 유니티 강의로 넘어오는게 나을까요 아니면 지금 하는대로 유니티먼저듣고 c++강의로 넘어가는게 맞을까요?중구난방하게 글을 적은 느낌이라 죄송합니다 ㅠㅠ
-
미해결유니티(Unity)로 시작하는 게임개발: Part 3. 슈팅게임 개발
강의도중 질문이 있습니다
선생님께서는 struct구조로 생성자를 많이 쓰시던데,class로 생성자를 만드는것과struct로 생성자를 만드는 것이어떤 차이가 있는지 궁금합니다.성능상에 차이만 있는건지제가 알기로는 class로 생성자를 만들면 초기값을 넣을 수 있다고 알고 있습니다.차이는 그정도일까요??
-
미해결유니티 머신러닝 에이전트 완전정복 (기초편)
알고리즘 관련
안녕하세요, 알고리즘 관련해서 질문드리고 싶어 글 남깁니다. 해당 드론 예제를 DDPG가 아닌 PPO로 학습할 경우 대체로 성능이 낮아질까요? 내장된 알고리즘이 아닌 DDPG를 선택해 사용하신 이유가 궁금합니다.또한 드론과 goal 사이에 여러 장애물이 무작위로 배치될 경우에도 해당 알고리즘으로 학습이 무리없이 진행될지 질문드리고 싶습니다. 강화학습에 입문하면서 도움 많이 받고 있습니다. 감사합니다!
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
new List 동기화 와 관련하여..
public List<IPacket> PopAll(){ List<IPacket> list = new List<IPacket>(); lock(_lock) { ...어떤 처리.. }} 이 함수가 멀티 스레드로 실행 된다고 했을대 list 이 변수는 안에가 list 형태인데 linkedlist 같은것도 스레드 세이프 한건가요?여러개의 스레드가 linkedlist 를 생성만 한다고 했을때(위의 예시처럼 원소 추가나 조작 없이) 동시에 new 연산이 내부에서 실행 된다 여러개 스레드에서 동시에 힙에 new 연산이 실행될것 같은데(예를 들어 c++ vector<> 같은..) 멀티스레드로 new 연산시 같은 주소에 생성될 일이 발생할 수도 있지 않을까 해서요 질문을 요약하자면-지역변수에서 힙쪽의 new 를 생성하는게 있다면 그것은 스레드 세이프한가? 라는것이 질문입니다답변 부탁드려요!