「Unity/UniTask」の版間の差分
(→IEnumeratorを実行) |
(→条件を満たしたら先へ) |
||
行73: | 行73: | ||
</pre> | </pre> | ||
MainCameraにaddComponentしてたら、Yの値を-1にすると先へ進む | MainCameraにaddComponentしてたら、Yの値を-1にすると先へ進む | ||
+ | |||
+ | ==入力待機== | ||
+ | <pre> | ||
+ | using UnityEngine; | ||
+ | using Cysharp.Threading.Tasks; | ||
+ | public class WaitScene : MonoBehaviour | ||
+ | { | ||
+ | void Start() | ||
+ | { | ||
+ | WaitInput(); | ||
+ | } | ||
+ | async void WaitInput() | ||
+ | { | ||
+ | // await UniTask.WaitUntil(() => Input.GetKeyDown(KeyCode.Return)); | ||
+ | await UniTask.WaitWhile(() => !Input.GetKeyDown(KeyCode.Return)); // 条件に当てはまらないときは、先にすすめる | ||
+ | // ここに処理を追加 | ||
+ | Debug.Log("return!!"); | ||
+ | } | ||
+ | } | ||
+ | </pre> | ||
==数秒待つ== | ==数秒待つ== |
2022年1月5日 (水) 19:36時点における版
目次
ダウンロード
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() { 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にすると先へ進む
入力待機
using UnityEngine; using Cysharp.Threading.Tasks; public class WaitScene : MonoBehaviour { void Start() { WaitInput(); } async void WaitInput() { // await UniTask.WaitUntil(() => Input.GetKeyDown(KeyCode.Return)); await UniTask.WaitWhile(() => !Input.GetKeyDown(KeyCode.Return)); // 条件に当てはまらないときは、先にすすめる // ここに処理を追加 Debug.Log("return!!"); } }
数秒待つ
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