Pular para o conteúdo principal

Início Rápido

Método async básico

using UnaPartidaMas.Valkarn.Tasks;

public class MyBehaviour : MonoBehaviour
{
async ValkarnTask Start()
{
await ValkarnTask.Delay(1000); // 1 segundo, zero alocação
Debug.Log("Concluído!");
}
}

Cancelamento automático ao destruir

Marque a classe como partial — o gerador de código-fonte faz o resto:

public partial class EnemyAI : MonoBehaviour
{
async ValkarnTask ChasePlayer()
{
while (true)
{
MoveTowards(player.position);
await ValkarnTask.Yield(); // cancela automaticamente quando este GameObject é destruído
}
}
}

Sem CancellationTokenSource, sem sobrescrita de OnDestroy, sem boilerplate.

WhenAll

// Aguardar múltiplas tasks — desestruturação suportada
var (texture, audio, data) = await ValkarnTask.WhenAll(
LoadTexture(),
LoadAudio(),
LoadData()
);

WhenAny

// O primeiro a concluir vence
var result = await ValkarnTask.WhenAny(FromCache(), FromNetwork());

Retornando um valor

async ValkarnTask<Texture2D> LoadTexture()
{
await ValkarnTask.SwitchToThreadPool();
var bytes = File.ReadAllBytes(path);
await ValkarnTask.SwitchToMainThread();
return CreateTexture(bytes);
}

Canais

var channel = Channel.CreateBounded<int>(capacity: 16);

// Produtor
await channel.Writer.WriteAsync(42);

// Consumidor
var value = await channel.Reader.ReadAsync();

Timing do PlayerLoop

// Continuar no início do próximo FixedUpdate
await ValkarnTask.Yield(PlayerLoopTiming.FixedUpdate);

// Continuar após o LateUpdate
await ValkarnTask.Yield(PlayerLoopTiming.LastUpdate);

Próximos passos