Inicio Rápido
Método async básico
using UnaPartidaMas.Valkarn.Tasks;
public class MyBehaviour : MonoBehaviour
{
async ValkarnTask Start()
{
await ValkarnTask.Delay(1000); // 1 segundo, cero asignaciones
Debug.Log("¡Listo!");
}
}
Auto-cancel al destruir
Marca la clase como partial — el generador de código fuente hace el resto:
public partial class EnemyAI : MonoBehaviour
{
async ValkarnTask ChasePlayer()
{
while (true)
{
MoveTowards(player.position);
await ValkarnTask.Yield(); // cancela automáticamente cuando este GameObject es destruido
}
}
}
Sin CancellationTokenSource, sin override de OnDestroy, sin código repetitivo.
WhenAll
// Espera múltiples tareas — desestructuración compatible
var (texture, audio, data) = await ValkarnTask.WhenAll(
LoadTexture(),
LoadAudio(),
LoadData()
);
WhenAny
// El primero gana
var result = await ValkarnTask.WhenAny(FromCache(), FromNetwork());
Devolver un valor
async ValkarnTask<Texture2D> LoadTexture()
{
await ValkarnTask.SwitchToThreadPool();
var bytes = File.ReadAllBytes(path);
await ValkarnTask.SwitchToMainThread();
return CreateTexture(bytes);
}
Canales
var channel = Channel.CreateBounded<int>(capacity: 16);
// Productor
await channel.Writer.WriteAsync(42);
// Consumidor
var value = await channel.Reader.ReadAsync();
Timing del PlayerLoop
// Continuar al inicio del próximo FixedUpdate
await ValkarnTask.Yield(PlayerLoopTiming.FixedUpdate);
// Continuar después de LateUpdate
await ValkarnTask.Yield(PlayerLoopTiming.LastUpdate);