시뮬레이션 동작
개요
SimulationBehaviour
는 NetworkBehaviour
의 기본 클래스이며, 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
는 생성 로직을 클라이언트가 몰라도 모든 클라이언트에게 올바르게 복제됩니다.