[SyncVar]
[SyncVar]
속성은 서버에서 클라이언트로 자동으로 변수를 동기화할 때 사용합니다. 서버에서 값이 변경되면 자동으로 모든 클라이언트에 전파됩니다.
주요 특징
- 서버에서 클라이언트로의 단방향 동기화입니다
- 클라이언트에서의 변경은 의미가 없습니다
- null 값은 사용할 수 없습니다
- 기본 타입(int, long, float, string, Vector3 등)과 NetworkIdentity를 포함한 GameObject를 지원합니다
기본 사용법
일반 변수 동기화
public class Player : NetworkBehaviour
{
[SyncVar]
public int health = 100;
[SyncVar]
public string playerName = "Player";
[SyncVar]
public Vector3 spawnPoint;
}
Hook 함수 사용
public class Player : NetworkBehaviour
{
[SyncVar(hook = nameof(OnHealthChanged))]
private int health = 100;
// hook 함수는 이전 값과 새로운 값을 매개변수로 받습니다
private void OnHealthChanged(int oldValue, int newValue)
{
// 체력 변경 시 실행할 로직
UpdateHealthUI(newValue);
PlayDamageEffect(oldValue - newValue);
}
}
NetworkIdentity가 있는 GameObject 동기화
public class PlayerEquipment : NetworkBehaviour
{
[SyncVar]
public GameObject currentWeapon; // NetworkIdentity가 있는 GameObject만 가능
[Server]
public void EquipWeapon(GameObject weapon)
{
if (!weapon.GetComponent<NetworkIdentity>())
return;
currentWeapon = weapon;
}
}
Hook과 NetworkIdentity 함께 사용
public class PlayerTeam : NetworkBehaviour
{
[SyncVar(hook = nameof(OnTeamChanged))]
public GameObject currentTeam; // NetworkIdentity가 있는 팀 오브젝트
private void OnTeamChanged(GameObject oldTeam, GameObject newTeam)
{
// 팀 변경 시 실행할 로직
UpdateTeamUI();
UpdatePlayerColor();
}
}
노트
- SyncVar는 서버에서만 값을 변경해야 합니다
- 클라이언트에서 SyncVar 값을 변경해도 동기화되지 않습니다
- Hook 함수는 값이 변경될 때마다 자동으로 호출됩니다
- GameObject를 SyncVar로 사용할 때는 반드시 NetworkIdentity 컴포넌트가 필요합니다