This document is about: FUSION 2
SWITCH TO

Fusion 네트워크 오브젝트 타입

개요

NetworkObjectNetworkBehaviour 참조는 NetworkBehaviour의 Networked 속성으로 사용할 수 있습니다.
(참고: INetworkStruct에서는 사용할 수 없습니다)

내부적으로, 이러한 Networked NetworkObjectNetworkBehaviour 참조는 각각 NetworkIdNetworkBehaviourId 값으로 변환됩니다.

ILWeaver가 생성한 Set 메소드는 참조를 해당 Id로 감싸서 네트워크를 통해 전송하며,
Get 메소드는 해당 Id를 Runner.TryGetObject()Runner.TryGetBehaviour() 메소드를 통해 다시 참조로 풀어냅니다.

C#

[Networked] public NetworkObject MyNetworkObject { get; set; }
[Networked] public CustomNetworkBehaviour MyNetworkBehaviour { get; set; }

이 자동화 기능은 편리하지만, 다음과 같은 의미도 내포합니다:

  • 명시적인 null 값과
  • unwrap 실패

이 둘 모두 Get에서 null을 반환하게 되어, 두 상황을 구분할 수 없습니다.

NetworkObjectNetworkBehaviour 대신,
속성에 NetworkIdNetworkBehaviourId를 명시적으로 사용하는 방법도 있습니다.

Id로 직접 참조를 동기화하면 null 값이 다음 중 어느 것인지를 감지할 수 있습니다:

  • 값이 0이면 명시적인 null
  • 값이 0보다 크지만 로컬에서 해당 오브젝트가 존재하지 않을 경우 (unwrap 실패)

NetworkId 사용 예시

C#

using Fusion;

public class SyncNetworkObjectExample : NetworkBehaviour
{
  // NetworkId is backed by one int value.
  // A zero value (default) represents null.
  [Networked] public NetworkId SyncedNetworkObjectId { get; set; }

  private void SetObject(NetworkObject netObj)
  {
    SyncedNetworkObjectId = netObj != null ? netObj.Id : default;
  }

  bool TryResolve(out NetworkObject no)
  {
    // A default (0) value indicates an explicit null value.
    // Return true to represent successfully resolving this to null.
    if (SyncedNetworkObjectId == default)
    {
      no = null;
      return true;
    }

    // Find the object using the non-null id value.
    // Return true if the lookup was successful.
    // Return false and null if the NetworkObject could not be found on the local Runner.
    bool found = Runner.TryFindObject(SyncedNetworkObjectId, out var obj);
    no = obj;
    return found;
  }
}

NetworkBehaviourId 사용 예시

C#

using Fusion;

public class SyncNetworkBehaviourExample : NetworkBehaviour
{
  // NetworkId is backed by two int values.
  // Object = NetworkObject.Id (value of 0 represents null/Invalid).
  // Behaviour = NetworkBehaviour index in GameObject hierarchy.
  [Networked] public NetworkBehaviourId SyncedNetworkBehaviourId { get; set; }

  private void SetBehaviour(NetworkBehaviour nb)
  {
    SyncedNetworkBehaviourId = nb != null ? nb.Id : default;
  }

  bool TryResolve(out NetworkBehaviour no)
  {
    // A default (0) value indicates an explicit null value.
    // Return true to represent successfully resolving this to null.
    if (SyncedNetworkBehaviourId == default)
    {
      no = null;
      return true;
    }

    // Find the NetworkBehaviour using the non-default id value.
    // Return true if the lookup was successful.
    // Return false and null if the NetworkObject could not be found on the local Runner.
    bool found = Runner.TryFindBehaviour(SyncedNetworkBehaviourId, out var obj);
    no = obj;
    return found;
  }
}
Back to top