This document is about: FUSION 2



Spawnedが呼ばれると、 StartGame()``StartArgs で渡された INetworkObjectProvider が、アタッチされるGameObjectの取得/生成を処理します。


INetworkObjectProvider のデフォルトの実装は NetworkObjectProviderDefault です。Runnerの起動時に StartArgs でプロバイダを指定しなかった場合、RunnerはRunnerゲームオブジェクトから INetworkObjectProvider コンポーネントを探します。もし見つからない場合、Runner は自動的に NetworkObjectProviderDefault を追加します。

この非常に基本的な実装では、Spawn() に応答して、渡されたプレハブのコピーをインスタンス化することでオブジェクトを生成します。逆に Despawn() 呼び出しは Destroy() で処理します。


オブジェクトをインスタンス化して破棄する代わりにプールする INetworkObjectProvider を作成する最も簡単な方法は、NetworkObjectProviderDefalt から派生し、InstiatePrefabDestroyPrefabInstance をオーバーライドすることです:


public class PooledNetworkObjectProvider : NetworkObjectProviderDefault
    protected override NetworkObject InstantiatePrefab(NetworkRunner runner, NetworkObject prefab)
        // Get object from pool and return it.

    protected override void DestroyPrefabInstance(NetworkRunner runner, NetworkPrefabId prefabId, NetworkObject instance)
        // Return the instance to the pool.



IMPORTANT: Once spawned and attached, Network Objects CANNOT have Network Behaviours added or removed. Any customization of the Network Behaviours on a Network Object must be done before spawning. It is of course still possible to add and remove any non-networked components.

重要: 一度スポーンしアタッチされたNetwork Objectは、Network Behavioursの追加や削除ができません。Network ObjectのNetwork Behavioursをカスタマイズする場合は、スポーンの前におこなう必要があります。もちろん、ネットワーク化されていないコンポーネントの追加や削除は可能です。


public class BakingObjectProvider : NetworkObjectProviderDefault
  // For this sample, we are using very high flag values to indicate that we need to do a custom instantiate
  // Values lower than this will fall through the default instantiation handling.
  public const int CUSTOM_PREFAB_FLAG = 100000;

  // The NetworkObjectBaker class can be reused and is Runner independent.
  private static NetworkObjectBaker _baker;
  private static NetworkObjectBaker Baker => _baker ??= new NetworkObjectBaker();

  public override NetworkObjectAcquireResult AcquirePrefabInstance(NetworkRunner runner, in NetworkPrefabAcquireContext context, out NetworkObject result)
    // Detect if this is a custom spawn by its high prefabID value we are passing.
    // The Spawn call will need to pass this value instead of a prefab.
    if (context.PrefabId.RawValue == CUSTOM_PREFAB_FLAG)
      var go = GameObject.CreatePrimitive(PrimitiveType.Cube);
      var no = go.AddComponent<NetworkObject>();
      go.AddComponent<NetworkTransform>(); = $"Custom Object";

      // Baking is required for the NetworkObject to be valid for spawning.

      // Move the object to the applicable Runner Scene/PhysicsScene/DontDestroyOnLoad
      // These implementations exist in the INetworkSceneManager assigned to the runner.
      if (context.DontDestroyOnLoad)

      // We are finished. Return the NetworkObject and report success.
      result = no;
      return NetworkObjectAcquireResult.Success;        

    // For all other spawns, use the default spawning.
    return base.AcquirePrefabInstance(runner, context, out result);
Back to top