vs code에서 사용하시는 테마가 궁금합니다. 저는 코드위에 마우스를 얹어놓아도 해당 코드에 대한 설명(어떻게 작성해야하는지, 인수들이 뭐가 있는지)가 안뜨는데 어떤 테마로 설정해야 나올수 있나요? 참고로 파일 - hover(?)값에서 사용으로 변경해놓았는데도 코드에 대한 설명이 안나옵니다..
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
안녕하세요. 너무 알찬 강의 잘 보고 있습니다! 혹시 강의 내용중 GameRoom room = player.Room ; if(room == null) return; 에서 클래스의 참조값에 의해 player.Room 이 null 이 된다하여도 room은 player.Room 의 값을 가지고 있어 null체크가 가능한건 알고있는데요 혹시 그러면 player.Room 의 인스턴스값인 RoomId 이 변하게된다면 room의 RoomId도 변경될텐데 RoomId 값의 검증도 필요할까요? 강의를 전부 본게 아닌지라 ㅠ 혹시 뒷부분에서도 RoomId의 검증같은 강의도 나올까요..? 나오게되면 강의를 쭉보면 알게될부분이니.. 여쭤봅니다. 감사합니다!
유튜브로 2D 기초 영상을 먼저 보고 난 후 강의를 듣고있습니다. 그 영상에선 플레이어 캐릭터 오브젝트에 따로 Renderer를 추가하지 않았던 걸로 기억하는데, 물리법칙이 적용되는 오브젝트와 렌더러를 따로 구분하는 이유가 있을까요?? 규모가 상당히 큰 게임이면 필요할 것 같긴한데 정확한 이유를 모르겠어서 여쭈어봅니다!
[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 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
안녕하세요. 강의 잘듣고있습니다.! GameRoom을 하나의 스레드로 jobqueue를 사용해서 공유자원을 관리 하면 lock에서는 자유롭지만 하나의 스레드인 만큼 많은 처리를 해야할 경우 딜레이가 생길수도 있을거라고 생각하는데 lock을 타이트하게 거는 방법보다 하나의 스레드에서 처리하는게 속도가 더 빠른가요?
적에게 닿고 체력이 깎인다음 닿은상태를 유지하면 체력이 깎이지 않습니다 닿은상태에서 벗어난뒤 다시 닿으면 체력이 깎이지만 어색하다고 생각됩니다 적에게 닿은상태를 유지해도 무적시간이 끝난뒤에 다시 피격되도록 하는방법이 없을까 궁금합니다 EnemyCollider 에서 OnTriggerEnter2D 로 체력이 깎이도록 되어있는데 어떻게 하면 좋을까요
3:34초에 Function, Float, int, String, Object 등 모든 변수가 나와야하는데 아무것도 없고 No Function Selected 상태입니다 수업을 그대로 따라하고 있어서 따로 코드 친건 없고 이전까지는 모두 다 똑같이 실행되었습니다 어떻게 해결해야할까요?? 유니티는 2022.3.21f1 LTS 버전입니다
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
모든 계산은 서버에서 하고 실제로 클라이언트는 보여주는 역할만 한다고 배웠습니다. 여기서 궁금한점이 있는데 유니티는 collider를 만들어서 충돌처리를 하는데 서버는 따로 유니티를 통해 키는것이 아니라서 collider게산이 쉽지 않을 것 같다는 생각이 들었습니다. 총의 충돌판정을 검사할 때 총알의 현재위치와 총알의 이전위치를 이용해서 선을 만든 후 충돌처리를 하려고 하는데 여기서 플레이어의 머리 몸통 다리 팔을 각각 collider로 나누고싶다면 직접 서버에서 머리 몸통 팔 다리 위치와 collider를 구상하고 collider를 직접 구현하고.. Raycast를 직접 구현해서 사용한다 충돌 계산 및 유니티 기능 이용을 목적으로 하는 클라이언트를 따로 제작한 후 각 위치에 collider를 직접 생산하고 유니티에 있는 기능을 이용한다. 플레이어의 모든 위치는 동기화 되어있을테니 총알을 쏜 당사자의 컴퓨터에서 충돌판단을 한 후 서버로 충돌여부를 전달한다 보통 어떤 방식이 맞는건가요? 흔히 실무자들이 말하는 모든 계산을 서버에서 한다는 말이 당장 개개인의 클라이언트에선 collider조차 만들지 않는다는 느낌인건가요? 그리고 만약 점프를 한다면 점프에서 계산마다 올라가고 내려가는걸 서버에서 직접 계산한 후 (9.8중력, 이동속도 등..) 각 플레이어에 동기화시켜주는게 맞는걸까요? 아니면 각 클라이언트의 Rigidbody를 이용해서 계산된 높이값을 서버로 전달하는게 맞는걸까요? 로컬상 이동 - 서버로 전달 - 동기화 로컬상 이동명령 - 서버에서 이동계산 - 동기화 및 블랜딩 이 강의에선 2번케이스 같은데 3d게임은 1번이 더 나은 것 같기도 하고 해서 질문드립니다.
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# 서버 연동 기초)
유니티 측에서 사용자정의 심볼을 넣어서 위 사진과 같이 전처리기를 사용해 Server측에서는 Console.WriteLine Client측에서는 Debug.Log 이 호출되도록 구성하였습니다. 에디터상에서 실행하는것까지는 크게 문제없이 잘 되는 것 같습니다! 이러면 어느쪽에서든 로직 사소하게 변경해도 복붙 까먹는 일이 없어 좋아보이는데 혹시 퍼블리싱단계나 추후에 크게 문제될 부분이 있을까요?
영상에서 7분즘에 이런 말씀을 하셨는데요. "커넥터를 딱 하나만 하는 경우도 있겠지만 경우에 따라서는 우리가 리스너에서 계속 뺑뺑이를 돌면서 천명이건 만명이건 계속 받을 수 있는 것처럼 커넥터도 한 번만 받고 끝내는게 아니라 여러 병을 받을 수 있으니까 굳이 이런 식으로 소켓으로 받기 보다는 이런 식으로 이벤트를 통해서 인자를 넘겨주고 있는 것이다." 하지만 그 리스너에서는 Socket을 필드로 들고 있도록 하셨었잖아요? Socket을 필드로 들고 있는 것과 SocketAsyncEventArgs의 Token으로 socket을 넘겨주는건 결국 똑같이 작동하는 건가요? connector에서는 Socket을 필드로 두지 않고 args의 token으로 socket을 건네주신 이유를 이해하지 못하겠습니다. 아니면 그냥 똑같이 동작하는데 이런 방법도 있다고 알려주기 위함이셨나요?
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)' 이런 경고문이랑 에러가 뜨면서 이게 고쳐져야 플레이를 할 수 있다고 하네요 어떡하죠?;;;;;
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
안녕하세요, 루키스님.개인 프로젝트를 진행하는 중 리슨서버를 구현해보려고 하는데 몇 가지 궁금한 점이 있습니다. 리슨서버를 구현하려면 서버 코드를 모두 클라이언트에 이식하고, 컴포넌트로 관리할 수 있도록 수정해야 하나요? 만약 1의 가정이 맞다면, 1을 통해 구현된 서버에서 유니티엔진의 기능들을 사용할 수 있지 않을까 생각이 되는데, 만약 된다면 충돌과 관련된 부분을 처리하는데 활용해도 괜찮을까요? 유니티 자체에서도 네트워크를 관리해주는 매니저를 제공하는 것으로 알고있는데, 강의처럼 따로 서버를 구현하는 이유는 역시 성능 때문일까요? 현재 생각 중인 방식이 어몽어스와 유사한데요.중앙 서버에서 방을 생성하는 유저(호스트)들의 ip와 방 정보를 가지고 단순히 방 목록을 관리하며 클라이언트들이 접속할 수 있는 역할만 해주고, 클라이언트가 방에 접속하는 순간부터 모든 처리는 호스트가 하게되는... 구조가 맞을까요? 최근 들어 질문을 자주하게 되는 것 같은데..항상 친절히 답변해주셔서 감사합니다.