Zum Hauptinhalt springen

Migration von UniTask

Valkarn Tasks ist in den meisten gängigen Fällen API-kompatibel mit UniTask. Dieser Leitfaden beschreibt die Unterschiede.

Typumbenennung

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

Namespace

// Vorher
using Cysharp.Threading.Tasks;

// Nachher
using UnaPartidaMas.Valkarn.Tasks;

Auto-Abbruch

UniTask erfordert manuelles CancellationTokenSource-Management. Valkarn Tasks generiert es:

// UniTask (manuell)
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 (quellgeneriert)
public partial class EnemyAI : MonoBehaviour
{
async ValkarnTask Chase()
{
while (true)
{
Move();
await ValkarnTask.Yield(); // wird bei Destroy automatisch abgebrochen
}
}
}

PlayerLoop-Zeitpunkte

Valkarn Tasks erweitert von 10 auf 16 Zeitpunkte. Alle UniTask-Zeitpunkte werden direkt abgebildet:

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

Neu in Valkarn Tasks: PreUpdate, LastPreUpdate, LastPreLateUpdate, PostLateUpdate, TimeUpdate, LastTimeUpdate.

Fire-and-Forget

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

// Valkarn Tasks
ValkarnTask.Forget(MyMethod());
// oder die Methode dekorieren:
[FireAndForget]
async ValkarnTask MyMethod() { ... }

Was in Valkarn Tasks besser ist

  • Auto-Abbruch per Quellgenerator — kein Boilerplate
  • 17 Analyzer-Regeln — Fehler zur Kompilierzeit abfangen
  • Burst / ECS — nativer Timer-Heap, asynchrone ECS-Systeme
  • 6 zusätzliche PlayerLoop-Zeitpunkte
  • Thread-bewusster Pool — keine Atomics auf dem Haupt-Thread