Unity C#側から宴スクリプトの変数を取得・更新する（公式サンプルに初心者向け補足）

#はじめに

[Unityのプログラムから、宴のパラメーターを操作する](http://madnesslabo.net/utage/?page_id=1715)

UnityやC#がわかる方だと公式のこの説明で終わる話だと思いますが、「Unityよくわかってないけど宴やってみよう」という昔の自分はこの説明を見てもハマってしまった経験があるので、昔の自分と初学者向けに補足してみたいと思います。

#usingの罠

公式などでC#サンプルがある場合、メソッドの中だけを書いている場合が多いですが、そこだけコピペしても動きません。
usingという~~おまじない~~名前空間の設定で、宴側で用意したメソッドを使えるようにします。

[【C#】名前空間（namespace）の概念と役割と使い方【個人的メモ】](https://qiita.com/samoedoz/items/41429ccc29318470acff)

>名前空間とは、クラスを種類ごとに整理する仕組みのこと。
>この仕組みのおかげで、長いコードを入力しなくても済む。

（正確にはusingを追記しなくても宴メソッドを呼ぶ際に名前空間も含めて書けばそれでもいいのですが、それ話すと長くなるので省略）

```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
```

UnityでC#スクリプトをクリエイトすると、最初から上記3つのusingが冒頭にあります。
これに宴用のusingを追記します。

```C#
using Utage;
```


#public AdvEngine engineの罠

よーし、これでもう動くぞー！…と思って実行しても、まだ動きません。

```C#
	public AdvEngine engine;
```

これです！こいつです！
これはAdvEngine型（クラス）の変数（インスタンス）engineを生成しているのですが、これだけだと中身は空です。
どうにかして、こいつに中身を入れなくてはいけません。

で、このサンプルでは中身を入れる部分がまったくないので「いつものようにうまいことやってね（暗黙の了解）」ということだと思いますが、publicで宣言しているため、インスペクタで実体をアタッチしてセットすることができます。

![インスペクタ.jpg](https://qiita-image-store.s3.amazonaws.com/0/166815/6439ab48-f0c3-c686-2d17-ce3667d18e00.jpeg)

UnityのヒエラルキービューにあるCreateからCreate Emptyで空のオブジェクトを作って、上記のC#スクリプトをAdd Componentした状態でインスペクタビューを見ると、上のようにEngine（スクリプトで宣言したengineのことですが頭文字が大文字になってます。そういうものです）が設定できるようになっています。

この「None (Adv Engine)」に宴のオブジェクト「AdvEngine」をアタッチします。

![ヒエラルキー.jpg](https://qiita-image-store.s3.amazonaws.com/0/166815/2a09f2d3-d0cf-e08e-f636-e379501a2b19.jpeg)

ヒエラルキービューからAdvEngineオブジェクトをドラッグ＆ドロップでアタッチしてもいいですが、「None (Adv Engine)」の右にある丸ボタン（これ名前なんですか？）を押すと候補が1つしかないので、こちらの方が迷いがなくてよいかもしれません。

![セレクトADVエンジン.jpg](https://qiita-image-store.s3.amazonaws.com/0/166815/b14a3f33-dde3-b3b2-1780-c028dbe4242a.jpeg)

これで今度こそいけるはずです（本当にいけるかどうか試してみてください）

#まとめ

公式のサンプルが省略していること（暗黙の了解）

- using Utageの追記
- engineにAdvEngineをアタッチ

~~…初学者はこんな暗黙、了解してません！~~

#サンプル補足版

###HogeSample.cs

```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Utage;

public class HogeSample : MonoBehaviour
{
	public AdvEngine engine;    //インスペクタでAdvEngineをアタッチする

	void Hoge() {
		//宴で宣言したBool型変数「flag1」を取得する
		//キャスト（型変換）エラーが出たので(bool)をつけてキャストする
		bool flag1 = (bool)engine.Param.GetParameter("flag1");

		//値を確認するためコンソールにデバッグ出力
		Debug.Log(flag1);

		//宴で宣言したBool型変数「flag1」に値「true」をセットする
		engine.Param.TrySetParameter("flag1", true);
	}
}
```

クラス名「HogeSample」はC#スクリプトファイル名と一致している必要があるため、C#スクリプトファイル名が「HogeSample.cs」ならこのままコピペでいけるはずです。
（AdvEngineのアタッチは必要です）

###宴スクリプト：Paramシート

![パラムシート.jpg](https://qiita-image-store.s3.amazonaws.com/0/166815/56fded34-5e45-dac2-7cbc-3720c587f2e2.jpeg)

このサンプルの宴スクリプト側ですが、ParamシートではBool型の変数「flag1」を初期値FALSEで設定しておきます。
（C#側でTRUEに変えるので）

###宴スクリプト：Startシート

![スタート.jpg](https://qiita-image-store.s3.amazonaws.com/0/166815/acec7649-23e6-9427-9a32-c8b0270ca89d.jpeg)

テスト用に組んだスクリプトです。
SendMessageByNameでGameObjectオブジェクトにあるC#スクリプト内のHogeメソッドを呼んでいます。
SendMessageByName前のflag1はFALSE、SendMessageByName後はTRUEになります。

#おわりに

すいません。
かつて「Unity触るなら当然知ってるよね？」的なトラップでだいぶハマッた者です。
自分と同じように「Unityよくわかんないけど宴ってやつ？使えば簡単に作れるっぽいー」と沼に近寄る者に、少しでも参考になれば幸いです。

…ところで

```C#
public AdvEngine engine;
```
このAdvEngineって型ですかね？クラスですかね？型でありクラスなんですかね？（わかってない）