NetworkTransform
게임이 실행되는 동안 position, rotation, scale을 동기화 하고 싶으면 NetworkTransform컴포넌트를 사용하면 됩니다
Network Object의 자식들에 NetworkTransform컴포넌트를 하나 이상 가지게 되면 각 자식 Objects들은 개별적인 독립체로 따로 따로 동기화 됩니다!
각 오브젝트는 독립적으로 움직입니다!
Client Network Transform 컴포넌트가 각 오브젝트마다 별개로 부착되어 있습니다!
모든 Transform을 동기화할 필요는 없습니다! 필요에 따라 체크를 하시면 됩니다!
Scale이 필요 없으면 Scale 체크를 다 해제하면 됩니다!
또한 너무 잦은 Transform Update를 막기 위해 Thresholds값을 사용할 수 있습니다
Threshold값 보다 낮은 변경점은 동기화가 이뤄지지 않습니다!
In Local Space를 체크하게 되면 World Position을 사용하는 것이 아닌 Local 공간을 사용하게 됩니다
그 아래 Interpolate는 기본적으로 체크하는 것이 좋습니다
보간법을 이용하면 더 부드럽게 위치를 동기화시킬 수 있습니다
NetworkAnimator
게임이 진행되는 동안 일어나는 애니메이션을 별도의 처리 없이 동기화시킬 수 있습니다!
뒤 늦게 참여하 플레이어들은 Animator의 트리커 프로퍼티를 제외한 모든 애니메이터의 현재 상태와 프로퍼티들은 동기화됩니다!
애니메이터 트리거는 오직 연결된 클라이언트에게만 동기화됩니다!
애니메이터의 프로퍼터는 이전 프레임의 프로퍼티 값이 변경된 상태여야만 동기화됩니다!
NetworkAnimator.SetTrigger함수를 통해 Trigger의 State를 동기화할 수 있습니다!
주의할점은 Animator.Trigger를 사용하면 안된다는 것입니다!
위 사진처럼 혼동해서 사용하면 안됩니다!(두 코드 모두 동기화 되는 예시입니다!)
알아두어야 할 부분은 Trigger를 제외한 나머지 프로퍼티들을 일반적인
Animator를 이용하여 실시간 동기화할 수 있습니다!(Client Network Animator (- 아래참고) 를 가진 상태에서만!)
Owner Authoritative Mode
기본적으로 NetworkAnimator컴포넌트에서 사용되는 행위는 서버권위적이므로 NetworkAnimator.SetTrigger를 사용하기 위해서는 서버/호스트에서만 할 수 있습니다
하지만 클라이언트측에서도 사용하고 싶다면 Network Animator를 사용하는 것이 아닌
Client Network Animator를 사용하면 됩니다!
[DisallowMultipleComponent]
public class ClientNetworkAnimator : NetworkAnimator
{
/// <summary>
/// Used to determine who can write to this animator. Owner client only.
/// This imposes state to the server. This is putting trust on your clients. Make sure no security-sensitive features use this animator.
/// </summary>
protected override bool OnIsServerAuthoritative()
{
return false;
}
}
Client Network Animator같은 경우 NetworkAnimator 컴포넌트를 상속받으며
protected override bool OnIsServerAuthoritative()
{
return false;
}
코드를 통해 서버권위적인 행위를 무시하게 됩니다!
[INFO]
While it isn't advised to have different NetworkAnimator authoritative models "under the same root network Prefab GameObject, " you can have multiple children that each have their own Animator and NetworkAnimator all housed under a single NetworkObject and all use the same authoritative model. However, you should always consider the balance between performance (CPU or bandwidth consumption) and convenience/modularity.