Idle Module
GameModes · Sub-module
Idle
방치형 시뮬레이션 게임 모드
백그라운드에서 틱 기반 시뮬레이션을 구동하는 GameMode 하위 모듈입니다. Flow 노드 그래프로 World를 생성·바인딩하고, SimulationBinding이 매 프레임 debt 누적 방식으로 정밀한 틱 타이밍을 보장합니다.
60 tick/s Flow Graph Playspeed Signal
COMPONENTS
구성 요소
IdleResourceHost
SceneResourceHost
Idle 게임 모드의 씬·자원 호스트입니다. Begin은 즉시 완료되며, End 시 2초 딜레이 후 정리됩니다. (전환 애니메이션 대기)
OnBeginAsyncUniTask.CompletedTask (즉시)
OnEndAsyncawait Delay(2s) 후 완료
SimulationBinding
IDisposable · sealed
SimulationHost를 감싸 매 프레임 틱을 구동합니다. debt 누적 방식으로 16.666ms 단위 틱을 정밀 제어하며 CancellationToken으로 수명을 관리합니다.
TickDurationMs16.666667 ms (≈ 60 tps)
_playspeedMultiplierSetPlayspeed Signal로 동적 변경
IdleGraphContextProfile
GraphContextProfile
Idle Flow Graph에서 사용 가능한 노드 타입을 제한합니다.
허용IdleFlowNodeBase · GameplayFlowNode · DataFlowNode
FLOW NODES
Flow 노드
Make World
Idle
WorldFlowGraph를 실행해
WorldData를 생성합니다. FlowSession을 임시 구동 후 결과 WorldData를 Blackboard에 저장합니다.INWorldFlowGraphWorld Graph
OUTWorldDataWorld
Begin Simulation
Idle
SimulationHost에 WorldData를 바인딩하고 SimulationBinding을 생성해 틱 루프를 시작합니다. SimulationHost 미입력 시 자동 생성합니다.
INSimulationHostSimulation Host (optional)
INWorldDataWorld (required)
End Simulation
Idle
SimulationBinding을 Dispose하여 틱 루프를 종료합니다. Blackboard에서 WorldData를 출력 포트로 전달합니다.
INSimulationHostSimulation Host (optional)
OUTWorldDataWorld
Dispose World
Idle
WorldData를 Dispose합니다. Blackboard에서 제거하며, 입력 미제공 시 Blackboard에서 자동으로 찾아 처리합니다.
INWorldDataWorld (optional)
Set Playspeed
Idle
SetPlayspeed Signal을 발행하여 SimulationBinding의 playspeedMultiplier를 변경합니다. SerializedField로 에디터에서 직접 설정합니다.
✕0 ✕1 ✕2 ✕4
Const Simulation Host
Idle · Data
PropertyStore에서 현재 바인딩된 SimulationHost를 출력하는 데이터 노드입니다. Execution 포트 없음.
OUTSimulationHostSimulation Host
FLOW PATTERN
일반적인 노드 연결 패턴
Make World
→
Begin Simulation
→
Set Playspeed
···
End Simulation
→
Dispose World
Begin → End 사이의 시뮬레이션 실행 중 Set Playspeed를 언제든 호출 가능
IMPLEMENTATION
SimulationBinding 틱 루프
C# SimulationBinding.cs
// debt 누적 방식으로 정밀한 틱 타이밍 보장
private async UniTaskVoid RunAsync(CancellationToken cancellationToken)
{
var debt = 0.0;
while (!cancellationToken.IsCancellationRequested && !_disposed && Host != null)
{
debt += Time.deltaTime * 1000.0 * _playspeedMultiplier;
var tickCount = (int)floor(debt / TickDurationMs); // 16.666667ms
debt -= tickCount * TickDurationMs;
var handle = Host.Update(tickCount);
await UniTask.Yield(PlayerLoopTiming.Update);
await handle;
}
} 2초 종료 딜레이
IdleResourceHost.OnEndAsync는 Delay(2초)를 대기합니다. GameMode EndAsync 큐에서 이 딜레이가 완료된 후 씬·자원이 언로드됩니다.WorldData / SimulationHost 교체 불가
BeginSimulationNode와 MakeWorldNode 모두 이미 바인딩된 인스턴스와 다른 객체를 주입하면
InvalidOperationException을 던집니다.Playspeed X0으로 일시정지
SetPlayspeedNode에서
SimulationPlayspeed.X0을 발행하면 _playspeedMultiplier = 0으로 설정되어 틱이 0회 발생합니다. 시뮬레이션을 사실상 일시정지합니다.