UniTaskの非同期処理やってみた

# UniTaskの非同期処理やってみた


こんにちは！！Asterです！！！
2022年9月23日-25日にかけてIwakenLabで熱海に温泉開発合宿を行いました！！
まず、支援者としてたくさんの方々から金銭面中心に支援をいただきました。本当にありがとうございました！！！

開発合宿の中で[まつさこさん](https://twitter.com/wappaboy)によるUniTask講座を開いていただきました。
その中で行ったことをまとめていきます。


# 目次
1\. UniTaskのインストール
2\. UniTaskなしVersion
2\. UniTaskありVersion
2\. UniTaskありVersion(変数あり)

# 1.UniTaskのインストール

Window > Package Manager からPackage Managerを開きます

![映画 & テレビ 2022_10_09 22_13_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1340659/2649eef7-fc13-365b-3eb6-f25b53aab7cb.png)

Add package from git URL... をクリックします。 

![映画 & テレビ 2022_10_09 22_18_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1340659/751563c3-c754-510f-7bdc-90ae1f7fc206.png)

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としては
```csharp:sample.cs
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を設定

![UniTaskProject - SampleScene - PC, Mac & Linux Standalone - Unity 2020.3.40f1 Personal_ _DX11_ 2022_10_09 21_34_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1340659/20cc22bd-df08-9dac-eb35-bc4952108071.png)

これで準備完了です.
一度、これで確認してみましょう。

![gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1340659/c806a987-e84e-c6ac-a97a-122306d5fd63.gif)



UniTaskを使わずに5秒経ったらTextを表示することはできました。
では、次にUniTaskを使って5秒経ったらTextを表示することをやってみましょう。

## UniTaskを使う場合

scriptとしては、

```csharp:UniTaskSampleScripts.cs

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で大事なところとして、
```csharp
    using Cysharp.Threading.Tasks;
```
これでUniTaskを呼び出すことができます。


```csharp
    
    async UniTask Wait()
    {
        await UniTask.Delay(5000);
    }

```
5秒待つ処理を行う関数となります。

```csharp
    
    async void Start()
    {
        await Wait();
    }

```
いつも通り関数を呼び出しを行いますが、
呼び出したい関数の前に await を書き忘れ内容にしましょう。
また、 Start()関数の前にもasyncを書きましょう。


これでscriptの準備が完了しました。

先ほどのUniTaskを使わないバージョンと同じようにTextとScriptを貼ったEmpty Objectを用意しましょう

![UniTaskProject - SampleScene - PC, Mac & Linux Standalone - Unity 2020.3.40f1 Personal_ _DX11_ 2022_10_09 23_03_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1340659/c0edbe1c-5610-0a2c-f76d-7b509b429a88.png)

さて、これで実行をしてみましょう。

![gif(2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1340659/500fd5b4-39d8-14fc-3ea7-78a4f4e56b25.gif)


UniTaskを使って5秒経ったらTextを表示することはできました。

少し応用も行いましょう。

UniTaskの関数内に変数を入れるバージョンです。

## UniTaskを使う場合(変数あり)

scriptとして、


```csharp:UniTaskSampleScripts.cs

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;
    }

}

```

先ほどと変わった場所は、

```csharp
    
    async UniTask<string> Wait(string text)
    {
        await UniTask.Delay(5000);
        var newText = "It's been" + text;
        return newText;
    }
```
関数を作るときに UniTask<string>となっているところですね。

```csharp
   async void Start()
    {
        var newText = await Wait("5 seconds");
        uniTaskText.text = newText;
        Debug.Log("5 seconds");
    }
```

今回も同様に関数を呼び出すときに await を忘れないように注意しましょう。

これで準備は完了しました。
実行してみましょう。

![gif(1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1340659/51bbe480-c545-de09-8954-0d4a76957c40.gif)



変数ありでも5秒経ったらTextを表示することはできました。


# まとめ
今回は非常に簡単な部分のみを記事にしました。
UniTaskを使わない時と比べ、UpDateを使わなくて済む、より複雑なコードになったときにわかりやすくなるなと感じました。
今後もUniTaskについて学習し、記事にしていこうと思います。