Simulation Behaviour
概要
SimulationBehaviour
はNetworkBehaviour
の基底クラスで、NetworkObject
を使わずにFusionの更新メソッド(FixedUpdateNetwork
やRender
など)へ安全にアクセスするために使用できます。
SimulationBehaviour
はネットワークプロパティを持つことはできず、ネットワークオブジェクトでの使用は想定されていません。
SimulationBehaviour
は、NetworkRunner.AddGlobal()
を使用してNetworkRunner
に手動で登録する必要がありますが、NetworkRunner
と同じゲームオブジェクトにある場合は登録は不要です。
SimulationBehaviour の登録/登録解除
NetworkRunner
と同じゲームオブジェクトに追加されていないSimulationBehaviour
は、手動で登録が必要です。
これを安全に実行する方法は、NetworkRunner.GetRunnerForGameObject()
メソッドを使用して、正しいNetworkRunner
の参照を検索することです。
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
はすべてのクライアントに正しく複製されるため、クライアントがその出現ロジックを知る必要はありません。