メインコンテンツまでスキップ

AchTask

AchTaskは、UniTaskとSystem.Threading.Tasks.Taskを1つのAPIに統合する非同期ラッパーです。 プロジェクトにUniTaskがインストールされていれば自動的にUniTaskを使用し、なければTaskにフォールバックします。

インストール検出

com.cysharp.unitaskパッケージがプロジェクトに存在すると、ENABLE_UNITASKシンボルが自動的に定義されます。 別途設定は不要で、asmdefのversionDefinesが検出するため、コードやドキュメントを書き換える必要はありません。

環境内部実装
UniTask インストール済みUniTask / UniTask<T>
UniTask なしSystem.Threading.Tasks.Task / Task<T>

await サポート

AchTaskは直接awaitできます。

await AchTask.Delay(2f);
await AchTask.WaitUntil(() => isReady);

静的ファクトリ

Delay / DelayRealtime

// ゲーム時間基準で待機 (UniTask: Time.timeScale反映 / Taskフォールバック: 壁時計)
await AchTask.Delay(1.5f);

// 実経過時間基準で待機 (timeScale無関係)
await AchTask.DelayRealtime(1.5f);

// CancellationToken対応
var cts = new CancellationTokenSource();
await AchTask.Delay(5f, cts.Token);

注意: DelayはUniTask環境ではTime.timeScaleを反映します。 スローモーション中も実時間で待機したい場合はDelayRealtimeを使用してください。

WaitUntil

// 条件がtrueになるまで待機
await AchTask.WaitUntil(() => player.IsGrounded);

// キャンセル可能
await AchTask.WaitUntil(() => dialogueFinished, cts.Token);

WhenAll / WhenAny

var a = AchTask.Delay(1f);
var b = AchTask.Delay(2f);
var c = AchTask.Delay(3f);

// 3つすべてが完了するまで
await AchTask.WhenAll(a, b, c);

// 最初に完了したものを待つ
await AchTask.WhenAny(a, b, c);

CompletedTask

// すでに完了したタスク (条件分岐の戻り値などに便利)
return condition ? DoWorkAsync() : AchTask.CompletedTask;

戻り値 — AchTask<T>

public static AchTask<string> FetchNameAsync()
{
return AchTask<string>.FromResult("Player");
}

string name = await FetchNameAsync();

暗黙的変換

UniTaskまたはTaskと相互変換できます。

// UniTask環境
UniTask uniTask = someAchTask; // AchTask → UniTask
AchTask achTask = someUniTask; // UniTask → AchTask

// Taskフォールバック環境
Task task = someAchTask.AsTask(); // AchTask → Task
AchTask from = someTask; // Task → AchTask (暗黙的)

全体の例

// 単純な順次待機
async AchTask LoadSequenceAsync(CancellationToken ct)
{
await AchTask.Delay(0.5f, ct); // フェードイン
await AchTask.WaitUntil(() => dataLoaded, ct);
await AchTask.Delay(0.2f, ct); // 遷移の余裕
}

// 複数タスクの並列実行
async AchTask InitAllAsync()
{
await AchTask.WhenAll(
LoadAudioAsync(),
LoadTableAsync(),
LoadUserDataAsync()
);
}

// 先に終わった方に分岐
async AchTask RaceAsync()
{
await AchTask.WhenAny(
AchTask.Delay(3f), // タイムアウト
AchTask.WaitUntil(() => input) // ユーザー入力
);
}

関連ドキュメント