본문 바로가기
유니티/서버

[SyncVar] vs [SyncVar(hook = nameof(OnOuterwearIndexChanged))]

by 유니티세상 2025. 6. 16.

기본적인 차이점

[SyncVar] (단순형):

[SyncVar]
private int index = 0;
  • 값이 변경되면 자동으로 모든 클라이언트에 동기화
  • 별도의 추가 동작 없음
  • 단순히 값만 업데이트

[SyncVar(hook = nameof(OnOuterwearIndexChanged))] (훅 포함):

[SyncVar(hook = nameof(OnOuterwearIndexChanged))]
private int index = 0;

void OnOuterwearIndexChanged(int oldValue, int newValue)
{
    // 값이 변경될 때마다 실행되는 콜백
    UpdateOuterwearAppearance(newValue);
}

주요 차이점

1. 콜백 함수 실행

  • 훅 없음: 값만 조용히 변경
  • 훅 있음: 값 변경 시 지정된 함수가 자동 실행

2. 사용 시나리오

// 훅 없는 경우 - 단순 데이터 동기화
[SyncVar]
private int playerScore = 0;

// 훅 있는 경우 - 변경 시 추가 동작 필요
[SyncVar(hook = nameof(OnHealthChanged))]
private int health = 100;

void OnHealthChanged(int oldHealth, int newHealth)
{
    // UI 업데이트
    healthBar.SetHealth(newHealth);
    
    // 이펙트 재생
    if (newHealth < oldHealth)
        PlayDamageEffect();
}

3. 성능 고려사항

  • 훅 없음: 더 가벼움, 단순한 값 동기화
  • 훅 있음: 약간의 오버헤드, 하지만 필요한 경우가 많음

4. 실제 활용 예시

public class PlayerCustomization : NetworkBehaviour 
{
    // 단순 동기화만 필요
    [SyncVar]
    private int playerLevel = 1;
    
    // 외모 변경 시 즉시 반영 필요
    [SyncVar(hook = nameof(OnOuterwearChanged))]
    private int outerwearIndex = 0;
    
    void OnOuterwearChanged(int oldIndex, int newIndex)
    {
        // 3D 모델의 옷 변경
        characterRenderer.material = outerwearMaterials[newIndex];
        
        // 애니메이션 트리거
        animator.SetTrigger("ChangeClothes");
    }
}

 

결론: 값 변경 시 추가적인 동작(UI 업데이트, 외모 변경, 이펙트 등)이 필요하면 훅을 사용하고,

단순한 데이터 동기화만 필요하면 기본 SyncVar를 사용