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

UniTaskからの移行

Valkarn TasksはほとんどのよくあるケースでUniTaskとAPI互換性があります。このガイドでは相違点について説明します。

型の名前変更

UniTaskValkarn Tasks
UniTaskValkarnTask
UniTask<T>ValkarnTask<T>
UniTaskCompletionSourceValkarnTaskCompletionSource
UniTaskCompletionSource<T>ValkarnTaskCompletionSource<T>

名前空間

// 変更前
using Cysharp.Threading.Tasks;

// 変更後
using UnaPartidaMas.Valkarn.Tasks;

自動キャンセル

UniTaskは手動でCancellationTokenSourceを管理する必要があります。Valkarn Tasksはそれを自動生成します:

// UniTask(手動)
public class EnemyAI : MonoBehaviour
{
CancellationTokenSource _cts;

void OnEnable() => _cts = new CancellationTokenSource();
void OnDestroy() => _cts.Cancel();

async UniTaskVoid Chase(CancellationToken ct)
{
while (!ct.IsCancellationRequested)
{
Move();
await UniTask.Yield(ct);
}
}
}

// Valkarn Tasks(ソース生成)
public partial class EnemyAI : MonoBehaviour
{
async ValkarnTask Chase()
{
while (true)
{
Move();
await ValkarnTask.Yield(); // Destroy時に自動的にキャンセル
}
}
}

PlayerLoopタイミング

Valkarn Tasksは10から16のタイミングに拡張されています。すべてのUniTaskタイミングは直接マッピングされます:

UniTaskValkarn Tasks
PlayerLoopTiming.InitializationPlayerLoopTiming.Initialization
PlayerLoopTiming.LastInitializationPlayerLoopTiming.LastInitialization
PlayerLoopTiming.EarlyUpdatePlayerLoopTiming.EarlyUpdate
PlayerLoopTiming.FixedUpdatePlayerLoopTiming.FixedUpdate
PlayerLoopTiming.UpdatePlayerLoopTiming.Update
PlayerLoopTiming.LastUpdatePlayerLoopTiming.LastUpdate
PlayerLoopTiming.PreLateUpdatePlayerLoopTiming.PreLateUpdate
PlayerLoopTiming.LastPostLateUpdatePlayerLoopTiming.LastPostLateUpdate

Valkarn Tasksの新規追加:PreUpdateLastPreUpdateLastPreLateUpdatePostLateUpdateTimeUpdateLastTimeUpdate

Fire-and-forget

// UniTask
UniTask.Void(async () => { ... });

// Valkarn Tasks
ValkarnTask.Forget(MyMethod());
// またはメソッドを装飾する:
[FireAndForget]
async ValkarnTask MyMethod() { ... }

Valkarn Tasksで優れている点

  • 自動キャンセル — ソースジェネレーター経由、ボイラープレートなし
  • 17のアナライザールール — コンパイル時にバグを検出
  • Burst / ECS — ネイティブタイマーヒープ、非同期ECSシステム
  • 6つの追加PlayerLoopタイミング
  • スレッド対応プール — メインスレッドでアトミック操作なし