このページは編集中です。更新が保留になっている可能性があります。

シミュレーションの動作

概要

SimulationBehaviour は Fusion Network Simulation Loop に関連する全ての動作のベースとなるクラスです。シミュレーションの状態に影響を与える動作は、MonoBehaviour ではなく SimulationBehaviour から派生させる必要があります。

NetworkBehaviour とは異なり、SimulationBehaviour[Networked] 状態を保持することができません。そのため、Fusion Simulation Loopに基づいて実行される必要があるが、自身の状態を同期させる必要がない動作に最適なビヘイビアです。

N.B.: SimulationBehaviourNetworkBehaviour[Networked] 状態を修正することができます。

NetworkBehaviour[Networked] 状態に触れるロジックや、Fusion Update Loop の一部として実行されるロジックは、すべて FixedUpdateNetwork() で実装する必要があります。

トップに戻る

ネットワークオブジェクト

すべての SimulationBehaviour コンポーネントは、Object プロパティを介して、関連する NetworkObject にアクセスすることができます。

トップに戻る

Spawn と Despawn

Spawnned()Despawnned() メソッドを SimulationBehaviour に実装するには、それぞれ ISpawnedIDespawned インターフェイスを実装する必要があります。

トップに戻る

例えば、TanknarokのサンプルにあるLevelManagerはパワーアップを生み出します。パワーアップは NetworkObject ですが、LevelManager はシミュレーションの状態に影響を与え、その状態を知るだけで、その動作を実行することができます。したがって、SimulationBehaviourを継承することが正しい方法です。

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 を派生させなければなりません。

ドキュメントのトップへ戻る