07
29

SyncVar Attribute

SyncVar 어트리뷰트는 네트워크를 통해 변수의 상태를 자동으로 동기화하는 데 사용된다.

네트워크를 통해 여러 클라이언트들 간에 서로 다른 값을 동일하게 유지해야 할 때 유용하게 사용된다.

이 어트리뷰트를 사용하면 서버에서 변경된 변수의 값이
자동으로 클라이언트들과 동기화되어 모든 플레이어가 같은 게임 상태를 유지할 수 있게 된다.

예를 들어, 여러 플레이어가 접속하는 멀티플레이어 게임에서 각 플레이어의 체력을 동기화해야 한다면,
SyncVar 어트리뷰트를 체력 변수에 적용하여,
서버에서 플레이어의 체력이 변경되었을 때 모든 클라이언트들에게 자동으로 동기화되어 체력이 일치하게 된다.
SyncVar 사용법 참고

SyncEvent Attribute

SyncEvent 어트리뷰트는 네트워크를 통해 이벤트를 자동으로 전달하고 처리하는 데 사용된다.

일반적으로 특정 조건이 발생했을 때,
다른 클라이언트들에게 이벤트를 전달하여 동기화된 액션을 수행하도록 할 때 사용된다.

예를 들어, 여러 플레이어가 함께 플레이하는 총알 발사 게임에서, 한 플레이어가 총알을 발사하면,
SyncEvent 어트리뷰트를 사용하여 다른 클라이언트들에게도 총알 발사 이벤트를 전달할 수 있다.

이렇게 함으로써 모든 플레이어가 동기화된 총알 발사 애니메이션을 볼 수 있게 된다.
예제 코드: SyncVar, SyncEvent가 함께 사용됨
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;

// 네트워크 플레이어 컴포넌트를 정의합니다.
public class NetworkPlayer : NetworkBehaviour
{
    // 동기화할 변수에 SyncVar 어트리뷰트를 사용합니다.
    [SyncVar(hook = nameof(OnHealthChanged))]
    private int health = 100;

    // 이벤트를 동기화하기 위해 SyncEvent 어트리뷰트를 사용합니다.
    [SyncEvent]
    public event System.Action<int> OnHealthChangedEvent;

    // 플레이어의 체력을 가져옵니다.
    public int GetHealth()
    {
        return health;
    }

    // 플레이어의 체력을 설정합니다.
    public void SetHealth(int value)
    {
        health = value;
        // 체력이 변경되었음을 클라이언트에게 알립니다.
        OnHealthChangedEvent?.Invoke(health);
    }

    // SyncVar 변수의 값이 변경되면 호출되는 콜백 함수입니다.
    private void OnHealthChanged(int newHealth)
    {
        Debug.Log($"Health changed to: {newHealth}");
    }

    // 테스트를 위해 플레이어의 체력을 랜덤하게 감소시키는 함수입니다.
    private IEnumerator TestHealthChange()
    {
        while (true)
        {
            if (isServer)
            {
                int damage = Random.Range(5, 20);
                SetHealth(health - damage);
            }
            yield return new WaitForSeconds(2f);
        }
    }

    // 네트워크 플레이어가 활성화될 때 호출되는 함수입니다.
    public override void OnStartLocalPlayer()
    {
        base.OnStartLocalPlayer();
        StartCoroutine(TestHealthChange());
    }
}
health라는 변수에 SyncVar 어트리뷰트를 사용하여 체력을 동기화한다.
이때, 체력이 변경되면 OnHealthChanged 함수가 호출되어 로그를 출력하게 된다.

OnHealthChangedEvent라는 SyncEvent 어트리뷰트가 있는 이벤트를 정의하고,
SetHealth 함수에서 이벤트를 호출하여 클라이언트에게 체력이 변경되었음을 알린다.

OnStartLocalPlayer 함수에서는
테스트를 위해 플레이어의 체력을 랜덤하게 감소시키는 TestHealthChange 코루틴을 시작한다.
이렇게 함으로써 플레이어의 체력이 서버와 클라이언트에서 동기화되며, 체력이 변경될 때마다 로그가 출력된다.
COMMENT