Boltで使える色々なイベントの紹介

#Boltとは
AssetStoreで売られているビジュアルスクリプティングシステム
プログラミングを知らない人でもノードを組んで制御できるもの
主にFlow Graphs（UE4のBPみたいなもの）とState Graphs（[PlayMaker](https://www.assetstore.unity3d.com/jp/?stay#!/content/368)みたいなもの）で組んで行く
個人的には今一番きてるビジュアルスクリプティングシステム
<img width="790" alt="スクリーンショット 2018-08-18 18.10.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/158441/7ffd5bb1-8a89-bccc-0f89-d0647c18e7f6.png">
Flow Graphs（UE4のBPみたいなもの）
<img width="776" alt="スクリーンショット 2018-08-18 18.16.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/158441/6c127905-146c-e7bf-4a21-3096c9ac4e88.png">
State Graphs（[PlayMaker](https://www.assetstore.unity3d.com/jp/?stay#!/content/368)みたいなもの）
<img width="775" alt="スクリーンショット 2018-08-18 18.16.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/158441/9947e858-443c-7f90-318c-a707aed88a54.png">

#今回は
色々なUnityのイベントシステムをBoltでやったらどんな感じのノードになるかとか
スクリプトからBoltのイベントの呼び方などを紹介したいと思います

#動作環境
Unity2018.2.3f1
Bolt 1.4.0f3


#LifeCycle系イベントノード
UnityのStart（）やOnEnable()など
使用例
<img width="281" alt="スクリーンショット 2018-08-18 19.07.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/158441/df4865c7-9cc3-928b-4643-d0b06286cff7.png">
他多数
<img width="259" alt="スクリーンショット 2018-08-18 19.08.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/158441/a80ae9fb-0a7e-125a-798c-663031afcef2.png">

#Input系イベントノード
ハードからの入力など
主にゲームパッド、キーボード、マウスが取れる　

使用例
<img width="316" alt="Unity_2018_2_3f1_Personal__64bit__-_Untitled_-_2018_-_PC__Mac___Linux_Standalone__Personal___Metal_.png" src="https://qiita-image-store.s3.amazonaws.com/0/158441/f59b068b-7005-6b86-53ad-495e15e6e2dc.png">
他多数
<img width="423" alt="Unity_2018_2_3f1_Personal__64bit__-_Untitled_-_2018_-_PC__Mac___Linux_Standalone__Personal___Metal_.png" src="https://qiita-image-store.s3.amazonaws.com/0/158441/116dcea3-5e6a-ad2f-51ee-499b307ffa7c.png">


#UI系イベントノード
OnGUIやUGUIなどのボタンイベントなど
使用例
<img width="309" alt="Unity_2018_2_3f1_Personal__64bit__-_Untitled_-_2018_-_PC__Mac___Linux_Standalone__Personal___Metal_.png" src="https://qiita-image-store.s3.amazonaws.com/0/158441/91f51cc3-c60d-07ab-0bf3-ee6ad3cc13b8.png">
他多数
<img width="439" alt="Unity_2018_2_3f1_Personal__64bit__-_Untitled_-_2018_-_PC__Mac___Linux_Standalone__Personal___Metal_.png" src="https://qiita-image-store.s3.amazonaws.com/0/158441/f07a3c96-8eed-1872-849b-cb9efb5f6699.png">

#Application系イベントノード
アプリ終了時やアプリ再開時など
使用例
<img width="322" alt="スクリーンショット 2018-08-18 19.03.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/158441/4140c29b-4da6-c7e3-ba2d-03fb36384360.png">
他多数
<img width="363" alt="スクリーンショット 2018-08-18 19.04.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/158441/77d7f738-ce6e-d80a-f307-18c558e62997.png">

#Physics系イベントノード
当たり判定時など
使用例
<img width="392" alt="スクリーンショット 2018-08-18 19.11.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/158441/e0673da5-f744-fed6-ec9a-6a8566d5052e.png">
他多数
<img width="393" alt="スクリーンショット 2018-08-18 19.12.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/158441/44d6afda-0a62-6b27-bc1c-09941c7f42ec.png">

#Bolt固有イベントノード
ノード内で使えるイベント
使用例
<img width="452" alt="スクリーンショット 2018-08-18 19.30.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/158441/e46c5f77-b56a-c544-6d6e-fe98ca247132.png">
<img width="210" alt="スクリーンショット 2018-08-18 19.31.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/158441/b0320234-b029-5c7c-75a2-c318db7164f4.png">

#Uniyイベントノード
元々Unityにあるイベント　主にボタンクリックとかアニメーションイベントとかに使ったりする
使用例
<img width="304" alt="スクリーンショット 2018-08-18 19.31.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/158441/321ebef1-b4d1-111f-ff45-5197dbfc1fbf.png">
<img width="182" alt="スクリーンショット 2018-08-18 19.31.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/158441/b0a126bb-28d3-785d-310f-212f321c084a.png">

#以外のイベントノード
Animation,Editor,Hierarchy,Navigation,Pysics2D,Renderingなどがあります
<img width="216" alt="スクリーンショット 2018-08-18 19.36.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/158441/12d3175b-7348-7195-7e2b-9a5a4bed45ea.png">
大体使うのは上記のものかなと思います

#スクリプト→Boltイベント
スクリプト側

```C#:Send.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Bolt;

public class Send : MonoBehaviour {
	public GameObject target;
	// Use this for initialization
	void Start () {
		//第一引数　ターゲットなるノードがあるオブジェクト
		//第二引数　イベント名
		//第三引数　パラメーター　　第三引数以降は自由に引数の数を設定できる
		CustomEvent.Trigger(target,"RecivEvent","hoge");
	}
	
	// Update is called once per frame
	void Update () {
		
	}
}
```

ターゲット側のノード
<img width="367" alt="スクリーンショット 2018-08-18 19.57.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/158441/f5ffc528-819b-c213-d616-5c30e95e6f58.png">

#Bolt→スクリプトイベント
このままだとスクリプトのメソッドがノードとして呼べないので
Tools→Bolt→UpDateUnitOptionsを実行するとスクリプトのメソッドが使えるようになる
この手順は毎回新規でメソッド作った際や引数などを設定し直した場合など毎回実行してあげる必要があります
<img width="345" alt="スクリーンショット 2018-08-18 20.07.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/158441/1a2a19ba-016f-18df-6d08-d2eb9b66a1ba.png">
あとはターゲットとなるスクリプトのオブジェクトをドラック＆ドロップすれば任意のメソッドにアクセス可能です
![Aug-18-2018 20-18-07.gif](https://qiita-image-store.s3.amazonaws.com/0/158441/d76f7ee8-cf49-db45-c29c-382cf7f6daf3.gif)

受け側のスクリプト

```C#:Receiv.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Receiv : MonoBehaviour {

	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		
	}
	
	public void OnReceiv(string str)
	{
		Debug.Log("ReceivEvent!!");
	}
}
```

#Animationキーイベント→Bolt
自分はよく足音とかでAnimationキーイベントを使ってます
最初に適当にアニメーションを作ります
で適当にAnimationキーイベントを打ちます
キーイベントのFunctionをTriggerUnityEvent(string)を選びましょう
出てこないであれば、AnimationコンポーネントとFlowGraphsコンポーネントかStateGraphsコンポーネントが一緒のオブジェクトに入ってない可能性があるのでチェックしましょう　
Parametersにイベントの名前を指定しましょう
<img width="534" alt="スクリーンショット 2018-08-18 20.24.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/158441/12e0b2d1-63e2-d481-bb09-9ec80932fbf6.png">

次はノード側の設定です
イベント名前をAnimationキーイベントのParametersの名前と一緒にしましょう
<img width="381" alt="スクリーンショット 2018-08-18 20.31.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/158441/df438460-a4ba-27c7-5ec1-ac85bec95af3.png">
以上です

#TimeLineイベント→Bolt
ここではTimeLineからスクリプトを呼べるアセットを使います
基本TimeLineイベント→スクリプト→Boltの順番で処理をします
先にスクリプトの書いて、Boltコンポーネントが入っているオブジェクトにアタッチします
TimeLineイベントからUnityEventを呼べるようになります

```C#:Send.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Bolt;

public class Send : MonoBehaviour {
	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		
	}
	
	public void UnityEvent(string eventName)
	{
		//第一引数　ターゲットなるノードがあるオブジェクト
		//第二引数　イベント名
		//第三引数　パラメーター　
		CustomEvent.Trigger(gameObject,eventName,"hoge");
	}
}
```

Timeline events
https://assetstore.unity.com/packages/3d/characters/timeline-events-115300
アセットをインポートしてきたら
先にTimelineを作ります
作ったらTimeline画面を出し、現在あるトラックを全消しにします
そして、画面右クリックで新しいトラックTimelineEventTrackを追加します
<img width="573" alt="スクリーンショット 2018-08-18 20.44.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/158441/5da4a072-7742-66ad-294e-5f9a02464285.png">
追加したら、トラックのゲームオブジェクトがnullであれば、FlowGraphsコンポーネントかStateGraphsコンポーネントが付いているオブジェクトをアタッチしてください
画面右クリックでAddTimelineEventClipでクリップの追加をします
<img width="311" alt="スクリーンショット 2018-08-18 20.48.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/158441/a07d6fee-007c-d4b1-db25-01761580d4c8.png">
クリップをクリックするとメソッドが呼べる画面がInspectorに出ます
<img width="521" alt="スクリーンショット 2018-08-18 20.51.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/158441/93b71259-72df-c84e-2a73-5d8f31e3a00c.png">
Method with paramのチェックを付けて
Methodのプルダウンをクリックして
先ほど作ったスクリプトのメソッドを選びます
<img width="329" alt="スクリーンショット_2018-08-19_15_59_34.png" src="https://qiita-image-store.s3.amazonaws.com/0/158441/83d9c523-79bf-4934-e840-1a0474c38087.png">
選ぶとeventName（UnityEventの引数名）とゆうプロパティができるので、イベント名指定します
このイベント名はノード側のイベント名と同じにして紐ずけないといけないので覚えときましょう
ちなみに引数は１つしか指定できないっぽいです
<img width="271" alt="Unity_2018_2_3f1_Personal__64bit__-_test_unity_-_2018_-_PC__Mac___Linux_Standalone__Personal___Metal_.png" src="https://qiita-image-store.s3.amazonaws.com/0/158441/cab196d4-8008-0470-0778-881b88ca7d62.png">

次にノード側の処理です
<img width="347" alt="Unity_2018_2_3f1_Personal__64bit__-_test_unity_-_2018_-_PC__Mac___Linux_Standalone__Personal___Metal_.png" src="https://qiita-image-store.s3.amazonaws.com/0/158441/98f7f50e-a039-3428-7a83-966ae815103c.png">

以上こんな感じであれば、TimeLineイベント→Boltを呼べるのですが、
間にスクリプトを挟んでるのが気持ち悪くありませんか？
正直Bolt バージョンが1.3.0の時は直接呼べたのですが、1.４.0になってAPIが変わっていて、アクセスできなかったので今回はスクリプトを挟めた形をとりました
ちなみにできていた頃はこんな感じ
https://twitter.com/SaseKubrick/status/1015081688265658368