유니티에서 넷코드는 멀티플레이 관련 기능을 제공하는 유용한 API다.
하지만, 그만큼 사용하기 어려우며 문제가 생기는 순간 디버깅 지옥이 펼쳐진다.
최근 NewtorkVariable과 INetworkSerializable을 사용해 변수 동기화를 진행하는데, 클라와 서버 간의 데이터가 동기화되지 않는 문제가 발생하였다.
NetworkVariable의 ReadPermission을 Owner로 설정하고 NetworkSerialize 인터페이스 함수를 철저히 구현했는데도 도저히 동기화는 되지 않았다.
//... in Test.cs
NetworkVariable<TestNetClass> testNet = new NetworkVariable(new TestNetClass(),
NetworkVariableWritePermission.Everyone, NetworkVariableReadPermission.Owner);
//...TestNetClass
public class TestNetClass : INetworkSerializable
{
public float health;
public TestNetClass()
{
health = 100;
}
public void NetworkSerialize<T>(BufferSerializer<T> serializer) where T : IReaderWriter
{
serializer.SerializeValue(ref health);
}
}
(예시 NetworkVariable, INetworkSerializable 코드)
보통의 경우 동기화가 되야 하지만, 1) 프로젝트에서 사용하는 NetworkVariable의 수가 많음. 2) Serialize할 클래스 내부 변수 개수가 너무 많음 등, 알 수 없는 이유로 문제가 발생한 것 같았다.
그래서 그냥 강제로 동기화를 해주기로 했다.
Netcode의 NetworkVariable은 더티 플래그(Dirty Flag)가 존재하여 값의 변화를 감지한다.
더티 플래그가 켜져 있는 상태라면, OnValueChanged가 호출되고 해당 틱이나 다음 전송 주기에서 동기화를 진행해준다.
*Dirty Flag? https://luv-n-interest.tistory.com/1115

아래와 같이 필요한 시점에 SetDirty(true)를 호출해서 강제 동기화를 해주니 정상적으로 진행되었다.
//... in Test.cs
public void SetDirtyForce(bool isDirty)
{
testNet.SetDirty(isDirty);
}
public void SyncNetValueForce()
{
SetDirtyForce(true);
}
추후 문제 원인을 제대로 파악하게 된다면 글을 수정하러 와야겠다.
'게임개발 > Unity' 카테고리의 다른 글
| [Unity] Debug.Log 커스터마이징 (0) | 2025.07.12 |
|---|---|
| [Unity] 안쓰는 함수 멋지게 표현하기 (System.Obsolete) (0) | 2025.06.12 |
| [Unity] StopCoroutine, 코루틴 중지시키기 (3) | 2025.06.03 |
| [Unity] Button OnClick Event is triggered twice (0) | 2024.08.26 |
| [Unity] 마우스 커서 숨기기, 마우스 화면 고정(cursor visible, cursor lock) (1) | 2023.12.17 |