橋本翼(ツバサムス)

メタバースプログラマー。
UnityとUnreal Engineを専門的に扱う。
メタバース系スタートアップ企業に所属。

詳細はこちら

【Unity】コルーチンからUniTaskへの置き換え方

Unity

コルーチンからUniTaskへの置き換え方

説明

UniTaskで、コルーチンと同じ挙動をさせるには

下記のコードのように記述するが

yield return new WaitForEndOfFrame()」のみ、

同等の挙動をUniTaskで再現することは出来ないため、

「yield return new WaitForEndOfFrame()」を利用する場合は

コルーチンを使用する必要がある。

コード

using System;
using System.Threading;
using Cysharp.Threading.Tasks;
using UnityEngine;

public class Sample : MonoBehaviour
{
    private void Start()
    {
        //非同期メソッドを起動
        DoAsync(this.GetCancellationTokenOnDestroy()).Forget();
    }

    //コルーチンとほぼ同等の機能
    private async UniTaskVoid DoAsync(CancellationToken token)
    {
        //yield return nullに相当
        await UniTask.Yield();

        //CancellationTokenを指定する場合
        await UniTask.Yield(token);

        //実行タイミングを変更することも可能
        //yield return new WaitForFixedUpdate()に相当
        await UniTask.Yield(PlayerLoopTiming.FixedUpdate, token);
        await UniTask.WaitForFixedUpdate(token);

        //UniTask.NextFrameの場合は
        //必ず1フレーム経過する事を保障する
        await UniTask.NextFrame(token);
        await UniTask.NextFrame(PlayerLoopTiming.FixedUpdate, token);

        //指定時間待機する
        //yield return new WaitForSeconds()に相当
        await UniTask.Delay
            (TimeSpan.FromSeconds(1f), cancellationToken: token);

        //条件を満たすまで待つ
        //yield return new WaitUntil()に相当
        await UniTask.WaitUntil
            (() => num > 0f, cancellationToken: token);
    }
}

お問い合わせ

    コメント

    タイトルとURLをコピーしました