Unityに関連する記事です

待機後の処理のケーススタディ

1.デリゲートの置き換え


 コルーチンは Action 型のデリゲートを記述できます。
そのため、待機後に指定した処理を行うという書式が書けます。

 こちらをベースとして、UniTask に置き換えて書いていく方法を学習します。



 コルーチンは1秒間待機し、その後に指定されたアクションを実行します。

using System;
using System.Collections;
using UnityEngine;

public class CoroutineExample : MonoBehaviour
{
    private void Start()
    {
        transform.position = Vector3.one;

        StartCoroutine(DelayCoroutine(1, () => Debug.Log(transform.position)));
    }

    private IEnumerator DelayCoroutine(float delaySeconds, Action action)
    {
        yield return new WaitForSeconds(delaySeconds);

        action?.Invoke();
    }
}

 このようにすることで、コルーチンの処理にコールバック処理を追加できます



 それでは、コルーチンの処理を UniTask に置き換えてみましょう。


using Cysharp.Threading.Tasks;
using UnityEngine;

public class UniTaskExample : MonoBehaviour
{
    private async void Start()
    {
        transform.position = Vector3.one;

        await UniTask.Delay(1000);
        
        Debug.Log(transform.position);
    }
}

 UniTask は待機前提の処理になりますので、コールバック処理については、
デリゲートを利用せずとも同期処理を記述するような感覚で書いていくことが出来ます。

 また、待機処理用のメソッドもなくなりましたので、処理自体がすっきりとしました。



 コルーチンとUniTaskは、コールバック処理の実行方法が異なります。

 コルーチンでは、StartCoroutineの第2引数にActionを指定することで、コールバック処理を直接コルーチン内で実行できます。
これは非常に便利ですね。

 一方、UniTaskを使用する場合は、通常はawaitの下に処理を記述し、非同期処理が完了するとそれに続く処理が実行されます。
UniTaskの利点は、非同期処理の直感的な記述と、コードの直列化に対するサポートです。

 UniTaskは、複雑な非同期コードを管理しやすくし、非同期プログラミングをよりシンプルにします。
コールバック処理を実行する場合は、awaitの下にコードを記述する方法が一般的です。

 処理を比較するとわかりやすいですが、UniTaskは、非同期処理を簡単に読み書きできる強力なツールになっています。


2.匿名メソッドを利用したケースの置き換え


 ラムダ式も利用できますので、匿名メソッドを作成して処理を記述することも可能です。
 
using System;
using System.Collections;
using UnityEngine;

public class CoroutineCallbackExample : MonoBehaviour
{
    private void Start()
    {
        // 3秒後に処理を実行
        StartCoroutine(DelayMethod(3.0f, () =>
        {
            Debug.Log("3秒後に実行された処理");

            // ここで座標を移動するなどの追加の処理を行うことができます
      transform.position = Vector3.one;

        }));
    }

    private IEnumerator DelayMethod(float delaySeconds, Action action)
    {
        yield return new WaitForSeconds(delaySeconds);

        action?.Invoke();
    }
}



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

public class UniTaskCallbackExample1 : MonoBehaviour
{
    private async void Start()
    {
        // 3秒後に処理を実行
        await DelayAsync(3.0f, () =>
        {
            Debug.Log("3秒後に実行された処理");

            // ここで座標を移動するなどの追加の処理を行うことができます
            transform.position = Vector3.one;
        });
    }

    private async UniTaskVoid DelayAsync(float delaySeconds, Action action)
    {
        await UniTask.Delay(TimeSpan.FromSeconds(delaySeconds));

        action?.Invoke();
    }
}




 さらに簡潔に記述可能です。

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

public class UniTaskCallbackExample2 : MonoBehaviour
{
  private async void Start()
    {
        // 3秒後に処理を実行
        await UniTask.Delay(TimeSpan.FromSeconds(3.0f));

        Debug.Log("3秒後に実行された処理");

        // ここで座標を移動するなどの追加の処理を行うことができます
        transform.position = Vector3.one;

    }
}

 この方法を使用すると、非同期処理を直接イベントハンドラ内で扱うことができ、コードがより明瞭になります。

 UniTaskを介して非同期処理を管理するための新しいメソッドを作成する必要はありません。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu



技術/知識(実装例)

2Dおはじきゲーム(発展編)

2D強制横スクロールアクション(発展編)

3Dダイビングアクション(発展編)

2Dタップシューティング(拡張編)

レースゲーム(抜粋)

2D放置ゲーム(発展編)

3Dレールガンシューティング(応用編)

3D脱出ゲーム(抜粋)

2Dリアルタイムストラテジー

2Dトップビューアドベンチャー(宴アセット使用)

3Dタップアクション(NavMeshAgent 使用)

2Dトップビューアクション(カエルの為に〜、ボコスカウォーズ風)

VideoPlayer イベント連動の実装例

VideoPlayer リスト内からムービー再生の実装例(発展)

AR 画像付きオブジェクト生成の実装例

AR リスト内から生成の実装例(発展)

private



このサイト内の作品はユニティちゃんライセンス条項の元に提供されています。

管理人/副管理人のみ編集できます