This document is about: FUSION 2
SWITCH TO

NetworkObjectProvider

INetworkObjectProvider

Spawned가 호출되면, StartGame()StartArgs에서 전달된 INetworkObjectProvider가 연결될 GameObject를 가져오거나 생성하는 작업을 수행합니다.

NetworkObjectProviderDefault

INetworkObjectProvider의 기본 구현체는 NetworkObjectProviderDefault입니다. 만약 Runner를 시작할 때 StartArgs에서 별도의 제공자를 지정하지 않으면, Runner는 자신의 게임 오브젝트에서 INetworkObjectProvider 컴포넌트를 찾습니다. 해당 컴포넌트가 없을 경우, 자동으로 NetworkObjectProviderDefault를 추가합니다.

이 기본 구현체는 풀링 없이 Spawn() 호출에 대응하여 전달된 프리팹의 복사본을 인스턴스화합니다. 반대로, Despawn() 호출은 Destroy()로 처리됩니다.

풀링

객체를 인스턴스화하거나 제거하는 대신, 풀링을 활용하는 간단한 방법은 NetworkObjectProviderDefault를 상속받아 InstantiatePrefabDestroyPrefabInstance 메소드를 재정의하는 것입니다:

C#

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.
    }
}

사용자 정의 오브젝트 생성하기

미리 제작된 프리팹에 의존하는 대신 런타임에 커스텀 NetworkObject를 직접 생성할 수도 있습니다.

중요: 한번 생성되어 연결된 후에는 NetworkObject에 NetworkBehaviour를 추가하거나 제거할 수 없습니다. NetworkObject의 NetworkBehaviour에 대한 모든 사용자 정의 작업은 반드시 생성 전 완료되어야 합니다. 단, 네트워크에 연결되지 않은 컴포넌트는 여전히 추가 및 제거가 가능합니다.

C#

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>();
      go.name = $"Custom Object"; 
    
      // Baking is required for the NetworkObject to be valid for spawning.
      Baker.Bake(go);
    
      // Move the object to the applicable Runner Scene/PhysicsScene/DontDestroyOnLoad
      // These implementations exist in the INetworkSceneManager assigned to the runner.
      if (context.DontDestroyOnLoad) 
      {
        runner.MakeDontDestroyOnLoad(go);
      }  
      else 
      {
        runner.MoveToRunnerScene(go);
      }

      // 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