facebook twitter hatena line email

「Unity/UniTask」の版間の差分

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
(数秒待つ)
(サンプル)
行41: 行41:
 
}
 
}
 
</pre>
 
</pre>
 +
 +
==IEnumeratorを実行==
 +
UniTaskだと、IEnumeratorのものを、StartCoroutineではなくてawaitで実行できる。
 +
public class SampleScene : MonoBehaviour
 +
{
 +
    void Start()
 +
    {
 +
        // Exec();
 +
        ExecInvoke();
 +
    }
 +
    async void ExecInvoke()
 +
    {
 +
        await DelayMethod1(5.0f, 123);
 +
    }
 +
    IEnumerator DelayMethod1(float delay, int hoge)
 +
    {
 +
        yield return new WaitForSeconds(delay);
 +
        // ここに処理を追加
 +
        Debug.Log("DelayMethod1 exec " + hoge);
 +
    }
 +
}
  
 
==条件を満たしたら先へ==
 
==条件を満たしたら先へ==

2022年1月5日 (水) 19:10時点における版

ダウンロード

https://github.com/Cysharp/UniTask/releases

UniTask.2.2.5.unitypackageをDLしてインストール

ScriptableSingletonエラーが出る時

ScriptableSingleton already exists. Did you query the singleton in a constructor? UnityEditor.PackageManager.UI.PackageManagerProjectSettings:.ctor () (at /Users/bokken/buildslave/unity/build/Modules/PackageManagerUI/Editor/Services/ProjectSettings/PackageManagerProjectSettings.cs:102)

がでるときは、Pluginsに直接、csをインストールしてないか確認、unitypackageからインストールしてみる。

Taskとの比較

UniTaskは、Taskより軽く、SynchronizationContextへの依存がない。

Taskサンプルはこちら

Unity/Csharp/別スレッド [ショートカット]

サンプル

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Threading.Tasks; // Taskサンプル用
// using UniRx.Async; // UniTask ver1
using Cysharp.Threading.Tasks; // UniTask ver2
public class SampleScene : MonoBehaviour
{
    void Start()
    {
        Exec();
    }
    async void Exec()
    {
        var result = await ExecUniTask();
        Debug.Log("Exec " + result); // Exec Hello!!
    }
    async UniTask<string> ExecUniTask()
    {
        return await Task.Run(() => "Hello!!");
    }
}

IEnumeratorを実行

UniTaskだと、IEnumeratorのものを、StartCoroutineではなくてawaitで実行できる。 public class SampleScene : MonoBehaviour {

   void Start()
   {
       // Exec();
       ExecInvoke();
   }
   async void ExecInvoke()
   {
       await DelayMethod1(5.0f, 123);
   }
   IEnumerator DelayMethod1(float delay, int hoge)
   {
       yield return new WaitForSeconds(delay);
       // ここに処理を追加
       Debug.Log("DelayMethod1 exec " + hoge);
   }

}

条件を満たしたら先へ

async void Exec()
{
    await UniTask.WaitUntil(() => transform.position.y < 0);
    Debug.Log("ok");
}

MainCameraにaddComponentしてたら、Yの値を-1にすると先へ進む

数秒待つ

async void Hoge() {
    await UniTask.Delay(100); // ms
}

関数を2つ以上挟む

async void Hoge() {
    await Hoge2();
}
async UniTask<float> Hoge2() {
    await UniTask.Delay(100); // ms
    await UniTask.Delay(100); // ms
    return 200f;
}

参考

UniTask使い方 https://qiita.com/toRisouP/items/4445b6b9bf00e49eb147

UniTask ver2 https://qiita.com/toRisouP/items/8f66fd952eaffeaf3107