This document is about: FUSION 2
SWITCH TO

Networking Fusion Object Types

概要

NetworkObjectリファレンスおよびNetworkBehaviourリファレンスはNetworkBehaviourのNetworked Propertyになることができます (備考: INetworkStructでは有効ではありません)。

内部では、これらのネットワーキングされたNetworkObjectリファレンスおよびNetworkBehaviourリファレンスは、NetworkId値およびびNetworkBehaviourId値に変換されます。

ILWeaverが生成したSetメソッドはリファレンスをそのIDに変換(ラッピング)します。このIDがネットワークされるものです。

ILWeaverが生成したGetメソッドはRunner.TryGetObject()メソッドおよびRunner.TryGetBehaviour()メソッドを使用してそのIDをリファレンスに変換(ラッピング解除)します。

C#

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

便利ですが、この自動化は以下を意味します。

  • 明示的なNull値;
  • ラッピング解除の失敗

これらは両方とも、GetにNull値を返します。この点で2つに違いはありません。

NetworkObjectおよびNetworkBehaviourをプロパティに使用する代わりに、NetworkId値およびNetworkBehaviourId値を使用する代替案があります。

これらのリファレンスを明示的に同期することで、Null値が以下の場合に検知することができます。

  • 明示的なNull(0)を示している、または;_
  • オブジェクト(0より大きい値)を示しているが、そのObjectが現在ローカルに存在していない(ラッピング解除失敗)

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