AchTimer
AchTimerはasync/awaitベースのタイマーユーティリティです。
単純な待機からリアルタイムな進行状況の追跡まで、2種類の使用方法を提供します。
単純な待機
完了を待つだけでよい場合は、WaitまたはWaitRealtimeを使用してください。
// 게임 시간 기준 3초 대기
await AchTimer.Wait(3f);
// 실제 시간 기준 3초 대기 (Time.timeScale 영향 없음)
await AchTimer.WaitRealtime(3f);
| メソッド | 説明 |
|---|---|
Wait(seconds) | ゲーム時間(Time.deltaTime)を基準に待機 |
WaitRealtime(seconds) | 実時間(Time.unscaledDeltaTime)を基準に待機。スローモーション・一時停止の影響を受けない |
進行状況の追跡 (AchTimerHandle)
進行率の表示、残り時間の取得、手動キャンセルが必要な場合はAchTimer.Start()を使用してください。
返されたAchTimerHandleはそのままawaitできます。
var timer = AchTimer.Start(5f);
await timer;
AchTimerHandleプロパティ
| プロパティ | 型 | 説明 |
|---|---|---|
Duration | float | タイマーの総継続時間(秒) |
Elapsed | float | これまでの経過時間(秒) |
Remaining | float | 残り時間(秒)。0未満にはならない |
Progress | float | 完了割合(0 = 開始、1 = 完了) |
IsDone | bool | 完了またはキャンセルされたかどうか |
IsCancelled | bool | キャンセルされたかどうか |
Task | Task | 完了を表すTaskオブジェクト |
await handle と await handle.Task
両者は同一の挙動をします。キャンセル時にはTaskCanceledExceptionがスローされます。
// 두 방법 모두 동일
await timer;
await timer.Task;
Taskを直接参照すれば、他の場所で完了を処理したり、Task.WhenAnyなどに活用できます。
var timer = AchTimer.Start(5f);
// 진행률은 다른 Update 로직에서 참조하고
// 완료는 별도로 처리
_ = timer.Task.ContinueWith(_ => Debug.Log("완료"));
Cancel()
Cancel()を呼び出すと、タイマーは即座に停止し、IsCancelledがtrueになります。
すでに完了したハンドルに対しては何の効果もありません。
var timer = AchTimer.Start(10f);
// 조건 충족 시 수동 취소
if (playerDied)
timer.Cancel();
useUnscaledTimeパラメータ
AchTimer.Start()のuseUnscaledTimeをtrueに設定すると、Time.timeScaleに関係なく実際の経過時間を基準に動作します。
// 슬로우모션 중에도 정상 속도로 진행
var timer = AchTimer.Start(3f, useUnscaledTime: true);
CancellationTokenサポート
外部のCancellationTokenを渡すと、トークンがキャンセルされた時にタイマーも一緒にキャンセルされます。
var cts = new CancellationTokenSource();
// 10초 대기 — cts.Cancel() 호출 시 즉시 중단
await AchTimer.Wait(10f, cts.Token);
// Start()에도 동일하게 사용 가능
var timer = AchTimer.Start(10f, cancellationToken: cts.Token);
UIAchTimerコンポーネント
UIAchTimerは、AchTimerHandleの進行状況をTextとSliderにリアルタイムで表示するMonoBehaviourです。
Inspectorフィールド
| フィールド | 説明 |
|---|---|
Time Text | 時間値を表示するTextコンポーネント(任意) |
Progress Slider | 進行率(0~1)を表示するSliderコンポーネント(任意) |
Show Remaining | trueなら残り時間、falseなら経過時間を表示 |
Format | 時間表示用のフォーマット文字列。{0}が時間値に置換されます(デフォルト: {0:F1}) |
スクリプトからのバインド
var timer = AchTimer.Start(5f);
GetComponent<UIAchTimer>().Bind(timer);
await timer;
タイマーが完了するとコンポーネントが自動的にUnbind()を呼び出します。
手動で解除する場合はUnbind()を直接呼び出してください。
全体の使用例
// 단순 대기
await AchTimer.Wait(3f);
// 진행 상황 추적
var timer = AchTimer.Start(5f);
timerDisplay.Bind(timer);
await timer;
// CancellationToken으로 취소
var cts = new CancellationTokenSource();
await AchTimer.Wait(10f, cts.Token);
// 스킬 시전 중 이동하면 취소되는 예시
var cts = new CancellationTokenSource();
var castTimer = AchTimer.Start(2f, cancellationToken: cts.Token);
castBar.Bind(castTimer);
try
{
await castTimer;
// 시전 완료
FireSkill();
}
catch (TaskCanceledException)
{
// 이동으로 취소됨
ShowCancelMessage();
}