シミュレーションの動作
概要
SimulationBehaviour
は Fusion Network Simulation Loop に関連する全ての動作のベースとなるクラスです。シミュレーションの状態に影響を与える動作は、MonoBehaviour
ではなく SimulationBehaviour
から派生させる必要があります。
NetworkBehaviour
とは異なり、SimulationBehaviour
は [Networked]
状態を保持することができません。そのため、Fusion Simulation Loopに基づいて実行される必要があるが、自身の状態を同期させる必要がない動作に最適なビヘイビアです。
N.B.: SimulationBehaviour
は NetworkBehaviour
の [Networked]
状態を修正することができます。
NetworkBehaviour
の [Networked]
状態に触れるロジックや、Fusion Update Loop の一部として実行されるロジックは、すべて FixedUpdateNetwork()
で実装する必要があります。
ネットワークオブジェクト
すべての SimulationBehaviour
コンポーネントは、Object
プロパティを介して、関連する NetworkObject
にアクセスすることができます。
Spawn と Despawn
Spawnned()
と Despawnned()
メソッドを SimulationBehaviour
に実装するには、それぞれ ISpawned
と IDespawned
インターフェイスを実装する必要があります。
例
例えば、TanknarokのサンプルにあるLevelManager
はパワーアップを生み出します。パワーアップは NetworkObject
ですが、LevelManager
はシミュレーションの状態に影響を与え、その状態を知るだけで、その動作を実行することができます。したがって、SimulationBehaviour
を継承することが正しい方法です。
C#
public class LevelManager : SimulationBehaviour
{
[SerializeField] private float _powerupDelay;
[SerializeField] private NetworkObject _powerupPrefab;
private TickTimer _powerupTimer;
public override void FixedUpdateNetwork()
{
// All of the level management logic happens server-side, so bail if we're not the server.
if (!Object.HasStateAuthority) return;
// Only active duty of the LevelManager is to spawn powerups whenever the timer expires
if (_powerupTimer.ExpiredOrNotRunning(Runner))
{
// Reset timer, and check if there is a free spot to spawn a new powerup
_powerupTimer = TickTimer.CreateFromSeconds(Runner,_powerupDelay);
SpawnPoint spawnPoint = GetSpawnPoint(SpawnPoint.Type.Powerup);
if (spawnPoint != null)
{
Debug.Log("Spawning Powerup");
NetworkObject powerupobj = Runner.Spawn(_powerupPrefab, spawnPoint.transform.position, spawnPoint.transform.rotation, PlayerRef.None);
powerupobj.GetComponent<Powerup>().Init();
}
else
{
Debug.Log("Not Spawning Powerup - no free spot");
}
}
}
}
動作が [Networked]
プロパティを保持する必要がある場合は、代わりに NetworkBehaviour
を派生させなければなりません。