新機能 Unity Behavior で処理を勝手にOnStartさせたくない時

## 新機能 Unity Behavior が結構いい感じ

Unityで新たに実装された Unity Behavior をちょっと触ってみました。
かなり使いやすそう！と感じたものの、デフォルトだとインスペクターに作成したグラフをアタッチすると自動的に処理が走ってしまいます。

これですと、グラフの処理を必要なタイミングに応じてスタートさせたい時に困るので、
シンプル（？）な解決法を共有させていただきます。

#### インストール

![ss1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761814/88cb228e-eba0-20ad-ed1a-f8f1ab509bd8.png)

・Package Managerからインストールしてください。

#### グラフの作成

![ss2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761814/53e04ac5-1402-6436-1525-7b39bcfaa7e1.png)

・Assetsフォルダ下の好きなところにBehavior Graphを作成してください。

#### グラフ内の処理を設定

![ss4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761814/7d6cb8c5-0048-0a4b-1925-5abfa3cf128e.png)

・作成したグラフをダブルクリックするとウィンドウが立ち上がります。
・画面内で右クリックして、「Add → Action → Delay」等で、１秒後にログが出力される処理を作ってみます。

#### テストしてみる

![ss5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761814/55d0b782-50d4-fa1a-31bb-9a038e9e935d.png)

・ヒエラルキーにテキトーなオブジェクトを作成して、「Behavior Agent」をアタッチします。
・Behavior Agentの「Behavior Graph」に先ほど作成したグラフをアタッチします。
・テストプレイを実行してみると、コンソールにログが出力されます。

#### 自動的に実行されてしまうのをどうにかしたい

![ss6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761814/02ae338d-bb7e-46d4-c30a-9ac9f2e0a734.png)

・自動的に実行されたくないので、どうにかしていきましょう。
　グラフの画面に戻り画面左上の「Blackboard」にBoolean型の変数を追加します。
・変数名はここでは「Enable」にしておきましょう。

#### グラフを分岐させる

![ss8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761814/c4670cb4-2c8e-8306-42ed-9b5ae1947031.png)

・「Add → Flow → Conditional → Conditional Branch」で分岐を作ります。
・Trueの方で処理が進むようにしましょう。

#### 分岐の条件を設定する

![ss9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761814/44a82cf2-a163-329c-e57b-585f85063c5a.png)

・画面右上の「Assign Condition」から、先ほどBlackboardで作成したboolean型の「Enable」がtrueの時という形に条件を設定しましょう。

#### 外部から実行するためのスクリプトを作成する

・このままだと、ただ実行されないグラフができただけなので外部から実行するために以下のスクリプトを作成し、同じインスペクターにアタッチしましょう。

```
using UnityEngine;
using Unity.Behavior;

public class BehaviorStarter : MonoBehaviour
{
    private BehaviorGraphAgent behaviorGraphAgent;

    private void Start()
    {
        behaviorGraphAgent = GetComponent<BehaviorGraphAgent>();
        // 本来はここではなく、外部から自分のタイミングで実行する
        BehaviorStart();
    }

    public void BehaviorStart()
    {
        if (behaviorGraphAgent)
        {
            // Enableのboolフラグをオンにする
            behaviorGraphAgent.SetVariableValue("Enable", true);
            // Graphをスタートさせる
            behaviorGraphAgent.Start();
        }
    }
}
```

#### 再度テストしてみる
![ss11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761814/e9239abb-ac5f-e600-f820-2367deed055f.png)

・SetVariableValue("Enable", true)で、Enableフラグをオンにしてから
behaviorGraphAgent.Start()でグラフの処理を実行することができました。

あとは、**自分がグラフの処理を実行したいときに外部からBehaviorStart()を呼び出せば**いけそうですね！

#### なんか警告がでる

![ss10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761814/ae46d677-02a0-b2b8-f903-aa8fca8493e6.png)

・この警告は、「Falseの方の処理がなんもないけどいいの？意図的にそうしてるならこの警告は無視してOK」という内容なので、無視して問題ありません。

## 他のやり方について
今回はConditional Branchで分岐させるやり方になりましたが、おそらく他にも方法はあると思います。
Start On Event Message辺りでやれるんじゃないかと模索してみたのですが、
まだ新機能だけあって解説しているサイトがほとんどなく、ドキュメントを読んでもいまいち理解できなかったので…。こういうやり方もあるよ！ということで共有してみました。

何かの参考になれば幸いです。
もっとこうした方がいい！というアドバイスがあれば是非ご教授いただけると嬉しいです。

## Unity Behaviorの真価
Unity Behaviorのすごいところは、その拡張性の高さだと思っています。
この新機能には大きな可能性を感じています。Unity Muse用に作られた機能らしいですが（？）Museがなくても実用性はあると思います。
次回の記事では、グラフ用のオリジナルActionの作り方を紹介できればいいなと思います。