묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결유니티 2D RPG 게임 만들기
섹션4에서 Exp_Slider 연동하는 강의 내용이 없습니다.
섹션 4에서 Exp_Slider 연동하는 강의 부분이 없는데,섹션 4의 마지막 강의에서 갑자기 Exp_Slider가 움직이고, 정상적으로 움직이지 않는다고 하면서(4강_4(NPCUI) 강의 20분) 넘어갑니다. 강의 내용이 중간에 없어진 것 같습니다.확인 부탁 드려요.
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
몇 가지 질문이 있습니다!
안녕하세요, 루키스님.좋은 강의를 제공해주신 것에 대해 항상 감사드립니다.기존에는 서버의 코어 부분은 건드리지 않고 컨텐츠 부분만 직접 수정 및 추가하며 클라이언트와 연동해보는 사이드 프로젝트만 진행해보았고,서버 코어 부분에 대하여 좀 더 깊게 이해를 해보기 위해 다시 정주행을 하는 중 입니다.이유는 모르겠지만, 같은 내용의 강의를 계속해서 볼 때마다 점점 이해되는 범위가 달라지는 것이 느껴지는 것 같긴 하네요..이번에는 최대한 운영체제 같은 윗 분들의 사정(?)을 고려해보며 이해를 해보며 접근을 해보려고 하는데요.그러다 보니 몇 가지 의문점이 생겨 질문 드립니다. 1. 세션코드에서 Send부분에 lock안에서 enqueue를 하는 이유는 TCP 통신의 순서를 보장하기 위해서 인가요? 2. Recv부분은 왜 lock이 안걸려있는지 이해가 되지 않습니다.검색해보거나 다른 분들 질문을 참고해보면, ReceiveAsync 부분이 1개의 스레드만 접근하는 것을 보장하기 때문이라고 하시는 것 같은데요.이 부분은 소켓API 부분에서 보장해주는 건가요?그렇다면 다른 SendAsync와 같은 부분과 다르게 버퍼를 읽던 중 다른 수신을 받게 되어도, 수신을 처리하는 스레드가 스레드풀에서 제공되는 것이 아닌, 현재 수신을 처리 중인 스레드가 완료 될 때 까지 어딘가에서 대기하고 있다가 한 번에 처리되는 건가요? 3. PacketSession의 OnRecv 부분에서 BitConverter.ToUInt16 메서드가 메서드 자체적으로 바이트 배열의 시작하는 인덱스에서 '2바이트'만큼을 부호없는 정수로 바꾸는 메서드라고 알아보았는데요.메서드 자체에서 '2바이트'라고 지정해둔 것은 보편적으로 패킷의 크기를 나타내는 헤더를 2바이트로 정하기 때문인가요? 4. 위처럼 OnRecv에서 패킷이 온전하게 도착하지 않았을 때, 단순히 writePos만 옮겨진 상태로 다음 패킷을 받을 때까지 기다리기만 해도 되는 것은, TCP 통신 자체가 '순서를 보장하기 때문에 앞에서 온전하게 받지 못한 패킷에 대해서 다른 패킷보다 먼저 다시 보내주고', '온전하게 도착하지 않은 부분에 대해서만 보내주기 때문'일까요?그리고 그렇다면 위처럼 순서를 보장해주고, 상대가 어디까지 받았는지, 어디를 못 받았는지 판단하는 것은 운영체제에서 알아서 처리되는 건가요?만약 상대가 못 받았을 경우 다시 보내줘야 한다면, 커널에서 패킷을 송신한 뒤에도 상대가 온전하게 받았다고 신호하기 전까지는 커널 상의 버퍼에 해당 패킷을 계속 저장해두고 있으려나요? 5. ArraySegment를 사용할 때, Array를 통해 배열의 시작 위치를 넘기고 어떤 위치부터 조회할 지(?) 조회할 위치를 넘기는 부분이 Offset인 것 같은데요.Offset을 0으로 두고 readPos및 writePos나 DataSize, FreeSize 등을 통해 패킷 시작 위치나 범위를 지정해주는 것은 Offset 값을 변경하며 이를 컨트롤 하는 것이 복잡하기 때문인가요? 처음 강의를 수강할 때에 비하면 강의 내용이 점점 머릿속에 그려지고 구조와 흐름이 얼추 잡혀가는 느낌이지만,누군가가 "너 한 번 혼자서 서버 만들어봐!!"라고 한다면 강의를 참고하거나 구글링 없이 혼자 서버 코어 단을 만들 수 있을 거라는 엄두가 나질 않는데요.6. 4년제 학부 졸업생의 수준에서 서버 코드를 보고 이 부분은 왜 이렇게 작성된 것인지, 어떤 흐름으로 코드가 실행되는지 정도만 이해하면 게임 서버 프로그래머로 취업하기엔 충분할까요...?아니면 정말 혼자 서버 코어 부분을 작성할 수 있을 정도가 되어야 하는건가요? 강의 들으며 궁금했던 부분을 싹 모아서 정리해보니 장문의 질문이 되어버렸네요 죄송합니다 ㅠㅠ다시 한 번 좋은 강의 제공해주셔서 정말 감사합니다.
-
해결됨[유니티 레벨 업!] 모듈식으로 개발하는 퀘스트&업적 시스템
스크립터블 오브젝트 Instantiate?
런타임에 스크립터블 오브젝트를 복사하는 것은 별로 좋지 않은 행위라고 들었습니다. 직렬화된 일반 클래스를 사용하는 것이 더 좋다고 여러 차례 들어왔는데, Task 클래스를 일반 클래스로 전환하는 것이 좋은 생각인지 궁금합니다.
-
미해결C#과 유니티, 실전 게임으로 제대로 시작하기 (저자 직강)
사용하시는 테마가 궁금합니다
vs code에서 사용하시는 테마가 궁금합니다.저는 코드위에 마우스를 얹어놓아도 해당 코드에 대한 설명(어떻게 작성해야하는지, 인수들이 뭐가 있는지)가 안뜨는데 어떤 테마로 설정해야 나올수 있나요? 참고로 파일 - hover(?)값에서 사용으로 변경해놓았는데도 코드에 대한 설명이 안나옵니다..
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
강의중 GameRoom의 참조값에 대해 질문드립니다.
안녕하세요. 너무 알찬 강의 잘 보고 있습니다! 혹시 강의 내용중 GameRoom room = player.Room;if(room == null)return;에서 클래스의 참조값에 의해 player.Room이 null 이 된다하여도 room은 player.Room의 값을 가지고 있어 null체크가 가능한건 알고있는데요 혹시 그러면 player.Room의 인스턴스값인 RoomId 이 변하게된다면 room의 RoomId도 변경될텐데 RoomId 값의 검증도 필요할까요? 강의를 전부 본게 아닌지라 ㅠ 혹시 뒷부분에서도 RoomId의 검증같은 강의도 나올까요..? 나오게되면 강의를 쭉보면 알게될부분이니.. 여쭤봅니다. 감사합니다!
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
홀펀칭 질문도 괜찮을까요..?
안녕하세요, 루키스님유익한 강의 제공해주셔서 감사합니다항상 감사한 마음으로 수강하고 열심히 프로젝트를 진행해보고 있습니다.현재 프로젝트에서메인 서버에서는 모든 클라 게임 접속을 받고 로그인 및 방 입장 등을 관리합니다.클라가 게임룸을 생성하면 해당 클라에 Host라는 오브젝트가 생성되고, 해당 오브젝트는 서버 코드를 유니티에 호환되도록 수정을 거친 상황입니다.타 클라(로컬 네트워크 환경에서만 테스트 해보았습니다.)에서 방 목록에서 방을 선택하고 입장하면 중앙 서버에서가 호스트와 클라 사이에서 IP와 포트를 알려주는 중개 역할을 하며 두 클라이언트가 연결됩니다.해당 게임의 사이클이 끝나 게임이 종료되면, 클라이언트들은 로비로 돌아가며 1~3의 단계가 계속해서 반복됩니다.현재 프로젝트의 조건을 위와 같이 설정하였고,3번까지는 테스트를 완료했고, 정상적으로 동작하는 것을 확인했습니다. 하지만 4번에서 문제가 발생하는데,다시 방을 생성하면 클라와 호스트 사이에 패킷 전송이 되지 않는 것 같습니다.디버깅을 통해 확인해볼 때에는 호스트측의 OnConnected 메서드는 호출되는 것으로 보아서는 클라측에서 연결에 문제가 발생하는 것 같은데,구글링과 디버깅을 통해 여러가지 해결책을 시행해봤습니다.연결 종료 시 완전히 소켓이 종료되도록 세션 Disconnect()를 했습니다.소켓이 같은 주소의 포트 번호를 공유할 수 있도록 Connector와 Listener 코드의 소켓 설정 코드에Socket socket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);이렇게 ReuseAddress 설정을 추가했습니다.(중앙 서버 세션과 호스트 세션은 클라에서 개별적으로 다루고 있습니다)호스트 세션의 연결이 종료될 때, 호스트 세션의 _disconnected 변수를 다시 0으로 만들어,다음 연결 시 RegisterRecv등의 코드에서 if(_disconnected == 1) return;의 조건문에 걸리지 않도록 코드를 수정해보았습니다.2번의 방법을 시행해보기 전에는 '같은 주소의 포트를 사용할 수 없습니다?'와 같은 오류가 발생했었는데,2번을 시행한 뒤에는 오류는 발생하지 않지만 연결이 되지 않는 것은 마찬가지인 상태입니다.그 외에도 잡다하게 정말 많은 시도를 해보았는데,전혀 실마리가 보이지 않아 질문합니다..ㅠㅠ
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
3D 체력바의 Canvas가 같이 보이는 현상이 있습니다.
캔버스의 설정은 영상을 보고 똑같이 따라했고 설정도 똑같이 했는데 이런 현상이 있습니다. 답변 주시면 감사하겠습니다!
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
12주차 소스코드 실행하면 오류나네요
이 오류가 어떤오류인가요? 올려주신 파일 받아서 그대로 실행했는데 오류가 나요!~ 심지어 실행이 안됩니다. 타이틀 부터 게임 화면까지 맵이 없는건가요?
-
해결됨[유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템
section1 7-stat 강좌에서 delegate를 사용하신 이유가 궁금합니다.
public delegate void ValueChangedHandler(Stat stat, float currentValue, float prevValue); public event ValueChangedHandler onValueChanged;public event Action<Stat, float, float> onValueChanged; 위와 같이 delegate를 사용하셨는데, 아래 action 대신 사용하면 어떤 차이가 있는지, 또는 특별한 이유가 있는지 궁금합니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
ServerCore 일부 복붙하는걸 심볼릭링크로 해도 괜찮을까요?
유니티 측에서 사용자정의 심볼을 넣어서위 사진과 같이 전처리기를 사용해Server측에서는 Console.WriteLineClient측에서는 Debug.Log이 호출되도록 구성하였습니다. 에디터상에서 실행하는것까지는 크게 문제없이 잘 되는 것 같습니다! 이러면 어느쪽에서든 로직 사소하게 변경해도복붙 까먹는 일이 없어 좋아보이는데혹시 퍼블리싱단계나 추후에 크게 문제될 부분이 있을까요?
-
미해결[실전 게임 코드 리뷰] 유니티 클리커 게임
어떡하죠?
Assets\Spine\Editor\spine-unity\Editor\Asset Types\SpineAtlasAssetInspector.cs(319,22): warning CS0618: 'TextureImporter.spritesheet' is obsolete: 'Support for accessing sprite meta data through spritesheet has been removed. Please use the UnityEditor.U2D.Sprites.ISpriteEditorDataProvider interface instead.' Assets\Spine\Editor\spine-unity\Editor\Asset Types\SpineAtlasAssetInspector.cs(375,4): warning CS0618: 'TextureImporter.spritesheet' is obsolete: 'Support for accessing sprite meta data through spritesheet has been removed. Please use the UnityEditor.U2D.Sprites.ISpriteEditorDataProvider interface instead.' Assets\Scripts\Manager\IAPManager.cs(9,27): error CS0535: 'IAPManager' does not implement interface member 'IStoreListener.OnInitializeFailed(InitializationFailureReason, string)' 이런 경고문이랑 에러가 뜨면서 이게 고쳐져야 플레이를 할 수 있다고 하네요 어떡하죠?;;;;;
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
멘토링 신청 질문
이번에 운영하신다는 오마카세 언리얼5 강의는,기존에 온라인 강의로 오픈하신 언리얼5 강의 3개랑 무슨 차이 인가요?어떤 강의가 더 깊게 알려주는 지 궁금합니다.
-
미해결유니티 Addressable 을 이용한 패치 시스템 구현
Unable to load dependent bundle from....
원래는 아무 문제 없이 다운로드 받고 로드도 됐었습니다..근데.. 첫 다운로드(aws s3 버킷) LoadAssetAsync로 로드하면 갑자기 이렇게 뜹니다..원래는 안이랫는데..아무 코드도 고치지 않았어요... 예제에 나온대로 그대로 했고 이거구요 json 파일 확인해보면이렇게 있고..(형광펜으로 칠한 부분) 앱을 껐다 키고 다시 실행하면 로딩 성공합니다.. 이유를 모르겠어요... 에디터 2021 lts -> 2022 lts로 업데이트 하고 어드레서블도 1.21 버전으로 업그레이드 했어요. 1.21 버전부터 DownloadDependenciesAsync가 바뀌었고 더 이상 에셋 번들을 메모리에 불러오지 않는 것으로 바뀌어서 LoadAssetAsync 하면 unable to load 오류가 뜨게 되었어요 해당 문제 글은 많지만 해결책이 없네요..어떻게 해야 할까요 해당 글 출처(https://forum.unity.com/threads/unable-to-load-dependent-bundle-from-location.1493702/)
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
구현에 수학이 필요한 경우
실무에서도 개발자들이 전부 수학을 잘하진 않을텐데,구현에 수학이 필요한 경우 어떻게 구현하나요?지금까찌 수학 식이 들어간 코드가 꽤 나왔었는데구조나 설계?가 중요하지 그 부분은 별로 중요하지 않다고 하셨는데, 롤 케릭터 스킬들을 어떻게 구현할 지 생각해보라고 해셔서생각하다가 멀티플레이 기준으로 구현한다고 했을 때 다이애나,카밀,아트록스 등등 수학적으로 구현?해야될 것 같은 스킬들이 꽤 많은 것 같은데 게임 개발자들은 수학도 다 잘하는 건지 궁금하네요,,,
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
CheckHeroCampDistanceAndForcePath() 함수에서
forcePath를 큐에 넣는데Dequeue(); 한 번은 왜 해주는 건가요?
-
미해결[라이브 멘토링] 유니티 뱀파이어 서바이벌 장르 모작
어드레서블 로드 시 스프라이트는 하위객체의 찐이름으로 로드하는 이유가 뭔가요?
Addressables.LoadAssetAsync<T>(loadKey) 부분에서loadKey = "name.sprite[name]" 형식으로 들어가길래 에디터 어드레서블 그룹에서 찾아보니스프라이트 하위의 객체(?) 이름이더군요스프라이트만 이렇게 로딩하는 이유가 무엇일까요?
-
해결됨유니티 머신러닝 에이전트 완전정복 (응용편)
PPO 알고리즘을 ml-agents learn 명령어로 학습 및 추론할때 메소드 호출 순서 질문
안녕하세요!먼저 기초편에 이어서 응용편 강의를 공개해주셔서 정말 감사합니다!! 해당 강의를 들으면서 PPO 알고리즘을 ml-agents learn 명령어로 학습 할 때와 추론할 때 메소드 호출 순서에 대해서 궁금합니다.이 내용이 궁금한 이유는 각 학습 또는 추론 과정에서 각 메소드별로 연산 시간을 측정하기 위해서 입니다. 관련 자료를 어디서 확인할 수 있을까요? 감사합니다!
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
하반기 MMO 서버 개발
하반기 MMO 서버 개발은 c# or c++ 뭐로 개발할 예정이신가요?
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
안녕하세요 재귀허용 WriteUnlock() 질문드립니다!
public void WriteUnlock(){int lockCount = --_writeCount;if (lockCount == 0)Interlocked.Exchange(ref _flag, EMPTY_FLAG);}위의 코드에서 lockCount 지역변수를 만들어주신 이유가 따로 있으신지 궁금합니다! writeCount는 어차피 WriteLock을 잡은 애만 쓰는 변수라고 이해했는데, 그러면 writeCount-=1; if(writeCount==0) 이렇게 써도 괜찮지 않을까라는 생각이 들었습니다!너무 사소한 질문인 것 같은데, 열심히 듣다가 궁금해져서 질문드립니다ㅠㅠ
-
미해결[유니티 레벨 업!] 모듈식으로 개발하는 퀘스트&업적 시스템
궁금합니당
현재 2022.3.2f1 버전을 사용하고 있는데 json 패키지가 따로 없어서 에셋스토어에서 다운 할려고 찾아보니 그거 마저도 없는데 어떻게 해야 하는걸까요?