해결된 질문
작성
·
61
0
강의를 보던 중 궁금한 점이 생겼습니다.
몬스터의 체력변경을 수동으로 ServerRpc,ClientRpc를 사용했는데, NetworkVariable<>을 사용하지 않으신 이유가 있으실까요? NetworkVariable<int> 같은 형식으로 해당 변수를 선언하면 그 변수가 알아서 다른 클라이언트에게 전파되어 동기화 된다고 배웠습니다.
ugs 패키지를 임포트하고나면 오브젝트에 ClientNetworkTransform 컴포넌트를 부착할 수 있더라구요. 이걸 추가하면 그 오브젝트의 TRS(이동,회전,크기) 모두 자동으로 동기화를 해주는 듯 하던데 이것을 사용하지 않으신 이유가 있으실까요? 처음 배우는 입장에서 동기화를 신경쓰기가 제일 까다로운 부분인데 이 컴포넌트를 사용하면 적어도 트랜스폼에 한정해서는 동기화에서 도움을 받을 수 있는 것처럼 보입니다.
답변 2
1
안녕하세요!
1. 말씀주신대로 NetworkVariable<>을 사용하면 동기화가 자동으로 이루어지기는 합니다. 다만 현재 저희 게임같은경우에는 모든 클라이언트에 매 프레임마다 자동적으로 동기화를 하게 되면 오히려 낭비일 수 있습니다.
공격과, 피해, 그리고 유저가 소환을 통해서 각각 서버에 요청하고 클라이언트가 이를 받아오는 작업인 ServerRpc, ClientRpc는 데이터 소모를 줄이는 데 유용합니다.
2. ClientNetworkTransform역시도 동기화에 매우 유용하지만, 현재 저희의 오브젝트들은 이미 정해진 위치를 자동으로 움직이는 로직을 사용하고 있습니다. 커스텀으로 경로가 정해져있는 저희 게임 같은 경우에는 직접 위치를 설정하고 필요한 순간에만 데이터를 전송하여 제어하는것이 더 나을 것 같다고 판단하였습니다.
(설명을 덧붙여서 저희 게임은 스폰을 통해서 몬스터가 상단 혹은 하단에 배치되면 정해진 경로를 따라서 알아서 이동을합니다. 그렇기에 굳이 몬스터의 위치를 동기화 하는 ClientNetworkTransform을 사용하지 않아도 생성된 위치만 Client들에게 보내주면 알아서 움직여서 해당 기능을 포함하면 데이터 낭비가 우려된다고 볼 수 있습니다.)
네트워크 동기화를 수동으로 처리하는 과정에서 클라이언트와 서버 간의 데이터 흐름을 직접 제어해 보는 것은 네트워킹 이해에 큰 도움이 됩니다. 자동 동기화 기능은 편리하지만, 동작 방식을 충분히 이해하지 않으면 버그가 발생했을 때 원인을 파악하기 어렵기 때문에 학습 초반에는 ServerRpc와 ClientRpc를 활용해보는 것이 좋은 경험이 될 수 있습니다.
따라서 NetworkVariable과 ClientNetworkTransform을 사용하면 더 간단하게 동기화를 할 수 있지만, 프로젝트의 특성과 최적화, 그리고 세밀한 제어의 필요성에 따라 수동으로 RPC를 활용하는 경우가 많습니다. 나중에 프로젝트가 복잡해질수록 이러한 선택이 중요한 차이를 만들 수 있습니다.
물론 위에 내용은 제 개인적인 의견이며 질문주신 답을 드린겁니다. 이 부분 참고 부탁드리겠습니다 🙂
또한 좋은 피드백 감사드립니다 (__)
0
안녕하세요, 인프런 AI 인턴입니다. 신승혁 님.
유니티 멀티플레이 게임 개발에서 데이터 동기화와 관련된 질문을 주셨군요. 이를 해결하기 위한 기본 개념을 이해하는 것이 중요합니다. 질문하신 두 가지 핵심 사항에 대해 설명드리겠습니다.
NetworkVariable은 유니티의 Netcode for GameObjects에서 객체 상태를 관리하고 동기화하는 데 유용한 기능입니다. 그러나, 상황에 따라 ServerRpc 및 ClientRpc를 사용하는 것이 더 적합할 수 있습니다. 그 이유는 다음과 같습니다:
제어력 향상: NetworkVariable은 자동으로 동기화되지만, 경우에 따라 수동으로 직접 제어하고 싶을 때가 있습니다. 예를 들어, 데이터 변경이 빈번하지 않거나 특정 조건에서만 동기화가 필요할 때 ServerRpc와 ClientRpc를 사용하여 더 세밀한 제어가 가능합니다.
최적화: 매번 업데이트가 필요하지 않은 데이터의 경우 NetworkVariable 대신 Rpc를 사용하여 네트워크 트래픽을 줄일 수 있습니다.
따라서, 프로젝트의 요구 사항과 성능 고려 사항에 따라 적절한 방법을 선택하게 됩니다.
ClientNetworkTransform 컴포넌트는 자주 사용되는 트랜스폼의 동기화를 자동화하여 개발자의 부담을 줄여줍니다. 하지만 이를 사용하지 않을 이유는 다음과 같습니다:
성능 제약: 자동화된 동기화는 간편하지만 네트워크 트래픽이 증가할 수 있습니다. 성능에 민감한 응용 프로그램에서는 수동으로 최적화하는 것이 유리할 수 있습니다.
특수 기능 요구사항: 특정 물리적 제약이나 커스텀 로직이 필요한 경우 직접 동기화 로직을 구성하는 것이 필수적일 수 있습니다.
이 컴포넌트를 사용하지 않은 이유는 보통 개발 중에 더 많은 제어권이나 성능 최적화를 위해 직접 구현을 선택했기 때문일 수 있습니다.
이해를 돕기 위해 아래와 같은 기존 질문들과 답변을 참고해보세요:
- 오브젝트 풀링
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.