[Unity] NetworkVariable, INetworkSerializable Synchronization Problem

2025. 6. 5. 05:23·게임개발/Unity

유니티에서 넷코드는 멀티플레이 관련 기능을 제공하는 유용한 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

NetworkVariable check changes

 

아래와 같이 필요한 시점에 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
'게임개발/Unity' 카테고리의 다른 글
  • [Unity] Debug.Log 커스터마이징
  • [Unity] 안쓰는 함수 멋지게 표현하기 (System.Obsolete)
  • [Unity] StopCoroutine, 코루틴 중지시키기
  • [Unity] Button OnClick Event is triggered twice
깜냥c
깜냥c
게임 개발/클라이언트/AI/PS/기타 연구
  • 깜냥c
    Choice Program
    깜냥c
  • 전체
    오늘
    어제
    • 분류 전체보기 (58)
      • 언어 (11)
        • C,C++ (9)
        • C# (1)
        • Python (1)
      • PS (20)
        • 백준 문제 (19)
        • 알고리즘 (1)
      • 인공지능 (2)
      • 게임제작 (7)
      • 게임개발 (15)
        • Unity (8)
        • Unreal Engine (5)
        • Godot Engine (1)
      • 기타 (2)
  • 블로그 메뉴

    • 홈
    • 방명록
    • 블로그 소개
  • 링크

    • 김병장의 IT 블로그
    • 식품영양과 데이터사이언스
  • 공지사항

  • 인기 글

  • 태그

    UE5
    배낭 문제
    Godot
    C언어
    Unreal
    unity
    C++
    입출력
    BOJ
    백준
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
깜냥c
[Unity] NetworkVariable, INetworkSerializable Synchronization Problem
상단으로

티스토리툴바