This document is about: FUSION 2
SWITCH TO

시뮬레이션 동작

개요

SimulationBehaviourNetworkBehaviour의 기본 클래스이며, NetworkObject 없이도 Fusion의 업데이트 메소드(FixedUpdateNetwork, Render 등)에 안전하게 접근할 수 있도록 해줍니다.

SimulationBehaviour는 네트워크 속성을 가질 수 없으며, NetworkObject와 함께 사용하도록 설계된 것이 아닙니다.
이 클래스는 NetworkRunner.AddGlobal()을 사용하여 수동으로 NetworkRunner에 등록해야 합니다. 단, NetworkRunner와 동일한 GameObject에 존재하는 SimulationBehaviour는 등록할 필요가 없습니다.

SimulationBehaviour 등록 및 해제

NetworkRunner와 같은 GameObject에 속하지 않은 SimulationBehaviour는 수동으로 등록해야 합니다.
안전한 방법으로는 NetworkRunner.GetRunnerForGameObject() 메소드를 사용하여 해당 오브젝트의 올바른 러너를 찾는 방식이 있습니다. 아래 예시를 참고하세요.

C#

public void RegisterOnRunner() {
      // Find the network runner for this gameobject scene. This is useful on a scene object.
      var runner = NetworkRunner.GetRunnerForGameObject(gameObject);
      
      // Make sure the network runner is started and running.
      if (runner.IsRunning) {
        runner.AddGlobal(this);
      }
    }
    
    public void RemoveFromRunner() {
      // The same process can be done to remove the SimulationBehaviour.
      var runner = NetworkRunner.GetRunnerForGameObject(gameObject);
      if (runner.IsRunning) {
        runner.RemoveGlobal(this);
      }
    }

사용 예시

SimulationBehaviour는 Fusion의 내부 로직에 접근하기 위해 사용할 수 있지만, 네트워크 속성을 가질 수 없으며 다른 피어들과 동기화되지 않습니다.
이 클래스는 아이템 또는 파워업 생성기처럼, 서버에서만 실행되고 클라이언트는 생성된 결과물만 복제하면 되는 시나리오에 이상적입니다.

다음은 SimulationBehaviour를 사용한 파워업 스포너의 예시입니다:

C#

public class BasicPowerUpSpawner : SimulationBehaviour {

    // Local list of prefabs for the available power ups to be spawned.
    [SerializeField] private List<NetworkPrefabRef> _availablePowerUps = new List<NetworkPrefabRef>();

    private float _spawnDelay = 3f;

    public void RegisterOnRunner() {
      // Find the network runner for this gameobject scene. This is useful on a scene object.
      var runner = NetworkRunner.GetRunnerForGameObject(gameObject);
      
      // Make sure the network runner is started and running.
      if (runner.IsRunning) {
        runner.AddGlobal(this);
      }
    }
    
    public void RemoveFromRunner() {
      // The same process can be done to remove the SimulationBehaviour.
      var runner = NetworkRunner.GetRunnerForGameObject(gameObject);
      if (runner.IsRunning) {
        runner.RemoveGlobal(this);
      }
    }

    public override void FixedUpdateNetwork() {
      if (Runner.Tick % Mathf.RoundToInt(Runner.TickRate * _spawnDelay) == 0) {
        // Generate a random index to select a power up from the list.
        int randomIndex = Random.Range(0, _availablePowerUps.Count);
        // Spawn the selected power up.
        Runner.Spawn(_availablePowerUps[randomIndex]);
      }
    }
  }

주의: 이 스크립트는 NetworkRunner에 자동으로 등록되지 않습니다. 대신, 필요시 호출해야 하는 등록 메소드를 포함하고 있습니다.
사용 가능한 파워업의 목록은 로컬 리스트이며, 이는 오직 호스트/서버 인스턴스에서만 중요합니다.
하지만 생성된 파워업의 NetworkObject는 생성 로직을 클라이언트가 몰라도 모든 클라이언트에게 올바르게 복제됩니다.

Back to top