# async/await

各スクリプトはasync/awaitによる非同期待機に対応しております。

## 非同期待機メソッド

実装している非同期待機メソッドは以下の通りです。

- PlayableBehaviour.Yield
  次のOnUpdate呼び出しまで待機する。
- ActionBehaviour.WaitForExecute
  次のOnExecute呼び出しまで待機する。
  待機後はOnExecute内と同等扱いになるため、FinishExecuteの呼び出しが可能になります。

### Yield使用例

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    using UnityEngine;
    using Arbor;

    [AddComponentMenu("")]
    public class ExampleAwaitBehaviour : StateBehaviour
    {
    	public StateLink nextState;

    	async void WaitFrame(int frameCount)
    	{
    		try
    		{
    			int startFrame = Time.frameCount;

    			for (int i = 0; i < frameCount; i++)
    			{
    				await Yield();
    			}

    			Debug.Log($"{Time.frameCount - startFrame}");

    			Transition(nextState);
    		}
    		catch (System.Exception ex)
    		{
    			if (ex is System.OperationCanceledException)
    			{
    				return;
    			}

    			Debug.LogException(ex);
    		}
    	}

    	public override void OnStateBegin()
    	{
    		WaitFrame(10);
    	}
    }

このスクリプトを実行すると`await Yield();`を10回行った後、Consoleに`9`を出力して遷移します。
この例では、OnStateBeginの呼び出しと１回目の`await Yield();`呼び出し後が同一フレームになる点にご注意ください。

## CancellationTokenOnEnd

PlayableBehaviour.CancellationTokenOnEnd

ノードから抜けた時またはインスタンスが破棄されたときに非同期待機をキャンセルするトークンです。
YieldメソッドやWaitForExecuteメソッドはこのトークンでキャンセルされるようになっています。
他のメソッドで非同期待機処理を行う場合、必要であればこのキャンセルトークンを使用してください。

キャンセルされたときは、`System.OperationCanceledException`が投げられます。
呼び出し元は例外をcatchして適切にキャンセル処理を行ってください。

## UniTask

UniTaskを導入している場合`Yeild().ToUniTask()`でUniTask型に変換できます。

ToUniTaskメソッドを有効化するには、UniTaskの利用を参照してください。