GGua 日本語リファレンスEnglishGitHub ↗
英語版が正式な参照です。内容に差異がある場合は、英語版を優先してください。
GUIDE / VIRTUAL CLOCK

GuaClockを使うゲームロジックを停止して進める

GuaClockを時刻源にしたゲームロジックは、停止したり、実時間を待たずに指定時間だけ進めたりできます。

何を停止できるのか

時間依存処理GuaClockで制御できるか
GuaClockへScheduleしたcallbackできる
GuaClockのTickで更新するゲームロジックできる
GodotのTimer / SceneTreeTimerGuaClockへ移行しない限りできない
UnityのTime.deltaTime / WaitForSeconds / CoroutineGuaClockへ移行しない限りできない
物理、Animation、Audio、OS時刻、Networkできない

導入は二段階です。まずproduction codeで対象ロジックの時刻源としてGuaClockを注入し、次にtest codeからその共有ClockをInstallして操作します。ここでの「Install」は仮想Clockを有効化する操作であり、任意のgame objectへClockを自動注入する操作ではありません。

ゲームへ組み込んでからテストで操作する

Unityゲーム側の組み込みcsharp
// このgame subsystemが使っていた標準Timerを置き換える。
var clock = GuaUnityRuntime.Clock;
clock.Schedule(TimeSpan.FromSeconds(2), ShowMessage);

// 毎frameの時間更新が必要な処理はTickへ接続する。
clock.Tick += UpdateCountdown;
Godotゲーム側の組み込みgdscript
# このgame subsystemが使っていたTimerを置き換える。
gua.clock_schedule(2000.0, _show_message)

# 毎frameの時間更新が必要な処理はclock_tickへ接続する。
gua.clock_tick.connect(_update_countdown)
テスト側の操作csharp
GuaClockControls.InstallClock(host.Context);
GuaClockControls.PauseClock(host.Context);
GuaClockControls.RunClockFor(host.Context, TimeSpan.FromSeconds(2));

GuaAssertions.WaitForText(host.Context, "ready", "Ready").ToBeVisible();
操作効果
Install時刻0・running状態でmonotonicなGuaClockを開始。
PausebridgeとSemantic UI収集を動かしたままGuaClockだけ停止。
RunFor期限callbackとTickを刻み幅ごとに実行し、指定時刻へ正確に到達して再停止。
Resumeadapterが渡すunscaled deltaによる通常進行へ復帰。

GodotとUnity

Godotでは対象ロジックをGuaAutoAdapter.clock_scheduleまたはclock_tick signalへ移行します。UnityではGuaUnityRuntime.Clockを注入または取得し、ScheduleTickを使います。どちらのadapter pumpもGuaClockのPause中にbridge commandを処理し続けます。

外部からの操作

WebSocket、MCP、Inspectorでget_clockclock_installclock_pauseclock_run_forclock_resumeを共通利用できます。.NETテストには同期・非同期のGuaClockControlsがあります。