4 - 네트워크 속성
개요
이 섹션에서는 네트워크 속성
을 사용하여 플레이어의 위치 외에 네트워크를 통해 추가 데이터를 동기화하는 방법을 보여 줍니다.
네트워크 속성
Fusion은 NetworkTransform
컴포넌트를 NetworkObjects
에 추가할 때 트랜스폼을 동기화합니다. 스크립트의 변수와 같은 다른 상태는 네트워크를 통해 동기화되지 않습니다. 네트워크를 통해 상태를 동기화하려면 [Networked]
속성이 필요합니다. 네트워크 속성은 상태를 StateAuthority
에서 다른 모든 클라이언트로 동기화합니다.
클라이언트가 StateAuthority
이 없는 객체의 네트워크 속성을 변경하면 변경 내용은 네트워크를 통해 동기화되지 않고 로컬 예측으로 적용되며 향후 StateAuthority
에서 변경된 내용에 의해 무시될 수 있습니다. 모든 클라이언트에서 업데이트하려면 StateAuthority
의 네트워크 속성만 업데이트해야 합니다.
네트워크 속성의 간단한 예로는 플레이어의 색이 있습니다. 먼저 새 스크립트를 만들고 PlayerColor
라는 이름을 붙입니다. 네트워크 속성과 공용 필드를 추가하여 개체의 MeshRender
를 참조하도록 합니다.
C#
using Fusion;
using UnityEngine;
public class PlayerColor : NetworkBehaviour
{
public MeshRenderer MeshRenderer;
[Networked]
public Color NetworkedColor { get; set; }
}
네트워크 속성은 속성({get; set;}
)이어야 하며 일반 필드는 지원되지 않습니다.
다음 업데이트에서 StateAuthority
이 색상을 변경할 수 있는 코드를 추가합니다:
C#
void Update()
{
if (Input.GetKeyDown(KeyCode.E))
{
// Changing the material color here directly does not work since this code is only executed on the client pressing the button and not on every client.
NetworkedColor = new Color(Random.Range(0f, 1f), Random.Range(0f, 1f), Random.Range(0f, 1f), 1f);
}
}
버튼을 눌러도 MeshRender
의 색상이 바로 변경되지 않습니다. 대신 네트워크 속성이 업데이트됩니다. 이렇게 하면 색상의 변경 사항이 모든 클라이언트에 복제됩니다. 이제 남은 것은 각 클라이언트가 네트워크 속성의 변경 사항을 확인하고 그에 따라 메쉬 색상을 조정하는 것입니다.
Fusion에서는 OnChanged
콜백을 사용하여 이 작업을 수행합니다. 먼저 네트워크 속성이 변경될 때마다 호출할 함수를 만듭니다:
C#
private static void NetworkColorChanged(Changed<PlayerColor> changed)
{
changed.Behaviour.MeshRenderer.material.color = changed.Behaviour.NetworkedColor;
}
변경된 파라미터가 필요하며 속성을 가져오거나 설정하기 위해 변경되는 NetworkBehaviour
인스턴스에 접근할 수 있습니다. 타입은 Changed<PlayerColor>
로 네트워크 색상 네트워크 속성의 유형이 아니라 NetworkBehaviour
의 타입입니다.
마지막으로, 속성에 콜백을 다시 연결하려면 [Networked]
속성을 다음과 같이 대체합니다:
C#
[Networked(OnChanged = nameof(NetworkColorChanged))]
public Color NetworkedColor { get; set; }
플레이어 객체에 PlayerColor
컴포넌트를 추가하고 보간 대상에서 MeshRender
를 연결합니다. 플레이 모드로 진입하고 E
를 누르면 플레이어가 색을 변경하는 것을 편집 보기에서 확인할 수 있습니다. 이때 네트워크를 통해 색이 제대로 동기화되었는지 확인할 수 있는 빌드를 만들 수도 있습니다.