시뮬레이션 동작
개요
SimulationBehaviour
는 Fusion 네트워크 시뮬레이션 루프와 관련된 동작의 기본 클래스입니다. 시뮬레이션 상태에 속하거나 영향을 미치는 모든 행동은 MonoBehaviour
가 아닌 SimulationBehaviour
에서 파생되어야 합니다.
NetworkBehaviour
와 달리 SimulationBehaviour
는 [Networked]
상태가 될 수 없습니다. 따라서 Fusion 시뮬레이션 루프를 기반으로 실행해야 하지만 자체 상태를 동기화할 필요는 없는 동작에 적합합니다.
주의: SimulationBehaviour
는 NetworkBehaviour
의 [Networked]
상태를 변경할 수 있습니다.
NetworkBehaviour
의 [Networked]
상태에 해당하거나 Fusion 업데이트 루프의 일부로 실행되어야 하는 모든 로직은 FixedUpdateNetwork()
에서 구현되어야 합니다.
네트워크 객체
모든 SimulationBehaviour
컴포넌트는 Object
속성을 통해 관련된 NetworkObject
에 접근할 수 있습니다.
스폰 및 스폰 해제
SimulationBehaviour
내의 Spawned()
및 Despawned()
메소드를 구현하기 위해서는, 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
에서 상속받아야 합니다.