UniTaskの非同期処理やってみた
こんにちは!!Asterです!!!
2022年9月23日-25日にかけてIwakenLabで熱海に温泉開発合宿を行いました!!
まず、支援者としてたくさんの方々から金銭面中心に支援をいただきました。本当にありがとうございました!!!
開発合宿の中でまつさこさんによるUniTask講座を開いていただきました。
その中で行ったことをまとめていきます。
目次
1. UniTaskのインストール
2. UniTaskなしVersion
2. UniTaskありVersion
2. UniTaskありVersion(変数あり)
1.UniTaskのインストール
Window > Package Manager からPackage Managerを開きます
Add package from git URL... をクリックします。
https://github.com/Cysharp/UniTask.git?path=src/UniTask/Assets/Plugins/UniTask
↑のURLを入力して Add ボタンをクリック。
UniTaskのインストールはこれで完了です。
2.UniTaskでの時間処理
さて、ここからUniTaskを実際に触っていきましょう。
初めにやることとしては、いたって簡単です。
5秒経ったらTextを変更するだけです。
UniTaskを使わない場合
まず、UniTaskを使わずに5秒経ったらTextを変更してみましょう。
Scriptとしては
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class SampleScripts : MonoBehaviour
{
float _time = 0;
bool _flag = false;
[SerializeField] private Text _text;
void Update()
{
_time += Time.deltaTime;
if(_time > 5 && !_flag)
{
Debug.Log("5 seconds");
_text.text = "5 seconds";
_flag = true;
}
}
}
次に、下記のようにSceneの中にTextを準備してください。
1. CreateEmptyでGameObjectを生成
2. その中にscriptを Add Componet
3. script内のTextを設定
これで準備完了です.
一度、これで確認してみましょう。
UniTaskを使わずに5秒経ったらTextを表示することはできました。
では、次にUniTaskを使って5秒経ったらTextを表示することをやってみましょう。
UniTaskを使う場合
scriptとしては、
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Cysharp.Threading.Tasks;
public class UniTaskSampleScripts : MonoBehaviour
{
[SerializeField] private Text uniTaskText;
async void Start()
{
await Wait();
uniTaskText.text = "5 seconds";
Debug.Log("5 seconds");
}
async UniTask Wait()
{
await UniTask.Delay(5000);
}
}
scriptで大事なところとして、
using Cysharp.Threading.Tasks;
これでUniTaskを呼び出すことができます。
async UniTask Wait()
{
await UniTask.Delay(5000);
}
5秒待つ処理を行う関数となります。
async void Start()
{
await Wait();
}
いつも通り関数を呼び出しを行いますが、
呼び出したい関数の前に await を書き忘れ内容にしましょう。
また、 Start()関数の前にもasyncを書きましょう。
これでscriptの準備が完了しました。
先ほどのUniTaskを使わないバージョンと同じようにTextとScriptを貼ったEmpty Objectを用意しましょう
さて、これで実行をしてみましょう。
UniTaskを使って5秒経ったらTextを表示することはできました。
少し応用も行いましょう。
UniTaskの関数内に変数を入れるバージョンです。
UniTaskを使う場合(変数あり)
scriptとして、
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Cysharp.Threading.Tasks;
public class UniTaskSampleScripts : MonoBehaviour
{
[SerializeField] private Text uniTaskText;
async void Start()
{
/*
await Wait();
uniTaskText.text = "5 seconds";
Debug.Log("5 seconds");
*/
var newText = await Wait("5 seconds");
uniTaskText.text = newText;
Debug.Log("5 seconds");
}
/*
async UniTask Wait()
{
await UniTask.Delay(5000);
}
*/
async UniTask<string> Wait(string text)
{
await UniTask.Delay(5000);
var newText = "It's been" + text;
return newText;
}
}
先ほどと変わった場所は、
async UniTask<string> Wait(string text)
{
await UniTask.Delay(5000);
var newText = "It's been" + text;
return newText;
}
関数を作るときに UniTaskとなっているところですね。
async void Start()
{
var newText = await Wait("5 seconds");
uniTaskText.text = newText;
Debug.Log("5 seconds");
}
今回も同様に関数を呼び出すときに await を忘れないように注意しましょう。
これで準備は完了しました。
実行してみましょう。
変数ありでも5秒経ったらTextを表示することはできました。
まとめ
今回は非常に簡単な部分のみを記事にしました。
UniTaskを使わない時と比べ、UpDateを使わなくて済む、より複雑なコードになったときにわかりやすくなるなと感じました。
今後もUniTaskについて学習し、記事にしていこうと思います。