宴はプログラミングなしでもゲームを制作することができますが、スクリプトを書くことによって表現の幅を広げることもできます。
宴のパラメータに保存してある数値を使って複雑な計算をしたいときや、特殊な状況下で宴の機能を呼び出したいときなどには、スクリプトを自分で書く必要があります。
「宴でよく使う&便利なスクリプト」では、宴公式ホームページ(リファレンスやQ&A)で紹介されているスクリプトや、宴開発者の時村様から教えていただいた方法などをまとめていきたいと思います。
この記事は、その導入編です。
宴のパラメータや、宴の機能を扱いたいときは、ADVエンジンを指定するスクリプトを書いておく必要があります。
今回は、その「ADVエンジンを指定する方法」について解説します。
ADVエンジンを指定するスクリプト
基本的な指定方法
以下のように「using Utage;」と「public AdvEngine engine;」をスクリプト内に記述します。
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic;
using Utage;
public class クラス名 : MonoBehaviour {
public AdvEngine engine;
上記のスクリプトは、宴公式ホームページでも記述されているスクリプトです。
例:SendMessageについての解説ページ
記述例
//usingディレクティブ
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic;
using Utage;
//クラスの定義
public class MyClass : MonoBehaviour {
//AdvEngineの指定
public AdvEngine engine;
//メソッド(void Awake()、void Update()など)
void Awake()
{
bool flag = (bool)Engine.Param.GetParameter("Flag1");
//中略
}
}
usingディレクティブや、クラスの定義、メソッドについてよく分からない方は、以下の記事も参考にしていただけたらと思います。
[Unity]C#スクリプトテンプレートの初心者向け解説
基本的な指定方法のデメリット
ただ、この方法で指定した場合、自作したスクリプトをゲームオブジェクトにアタッチした後、そのゲームオブジェクトのInspectorで、 AdvEngineをアタッチする必要があります。
つまり、Inspectorの「None (Adv Engine)」と書かれている部分に、Hierarchy内にあるAdvEngineをドラッグ&ドロップ等でアタッチしなければならない、ということです。
ゲームオブジェクトが片手で数えられる程度の個数ならば、AdvEngineをアタッチすることはそれほど手間ではありませんが、数十個、数百個ともなると、それら全てにAdvEngineをアタッチすることはとても大変です。
AdvEngineをアタッチしなくてもよい指定方法
AdvEngineをアタッチする手間を省くことができるのが、以下のスクリプトです。
「using Utage;」の部分は基本的な指定方法と同じです。
「public AdvEngine engine;」の部分を変更しています。
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic;
using Utage;
public class クラス名 : MonoBehaviour {
public AdvEngine Engine { get { return this.engine ?? (this.engine = FindObjectOfType<AdvEngine>() as AdvEngine); } }
[SerializeField]
AdvEngine engine;
上記のスクリプトは、
Utage > Scripts > UI > AdvUiManager などでも使用されています。
このスクリプトを使用すると、ゲームオブジェクトにAdvEngineがアタッチされていなかったら、自動的にAdvEngineを探してくれます。
ですので、一つ一つのゲームオブジェクトにAdvEngineをアタッチする手間を省くことができます。
ただし、この方法を使用した際、宴のスクリプト(例:engine.Param.GetParameter("");等)を使用する際は、engineの最初のeを大文字にして、Engineとして記述する必要があります。
(例:engine.Param.GetParameter(""); → Engine.Param.GetParameter("");)
宴の公式ホームページなどでは、大抵最初のeは小文字になっているので、コピペする際に注意してください。
なお、この「宴でよく使う&便利なスクリプト」の記事では、全て最初のeは大文字にした状態で紹介していきます。
AdvEngineをアタッチしなくてもよい指定方法・ヒント表示付き
私自身は、以下のようにHeaderとTooltipを追加した状態で使用しています。
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic;
using Utage;
public class クラス名 : MonoBehaviour {
public AdvEngine Engine { get { return this.engine ?? (this.engine = FindObjectOfType<AdvEngine>() as AdvEngine); } }
[SerializeField]
[Header("宴のエンジン(指定不要)")]
[Tooltip("スクリプトはEngineにすること")]
AdvEngine engine;
上記のようにしておくと、Inspecterで「宴のエンジン(指定不要)」と表示され、Engineの文字の上にカーソルを持ってくると、「スクリプトはEngineにすること」とツールチップが表示されるようになります。(備忘録として、HeaderとTooltipにメモしている状態です。)
まとめ
・宴独自のスクリプトを使用するには、「using Utage;」と「public AdvEngine engine;」を記述しておく必要がある。
・「public AdvEngine engine;」は、以下のように記述することで、AdvEngineのアタッチを省略することができる。
public AdvEngine Engine { get { return this.engine ?? (this.engine = FindObjectOfType<AdvEngine>() as AdvEngine); } }
[SerializeField]
AdvEngine engine;
・ただし、AdvEngineのアタッチを省略するスクリプトを使用した場合、宴独自のスクリプトでは、engineの最初のeを大文字に変更する必要がある。
プログラミング未経験者&入門者の方へ
この「ADVエンジンの指定」は、宴で自作スクリプトを使用する際、つまずきやすいポイントの1つです。
意味を完全に理解しようとすると大変なので、まずは、
『宴を使ったゲームでは、「using Utage;」と「public AdvEngine engine;(もしくは、AdvEngineのアタッチを省略できるスクリプト)」をスクリプトに書く』
ことを、(現段階では意味や仕組みを気にせず)1つの決まりだと思って覚えてしまうと良いかと思います。
正確には、プログラムの内容によっては、「using Utage;」と「public AdvEngine engine;」が必要でない場合もあります。(宴独自のスクリプトを使用せず、C#やUnityに備わっているスクリプトでプログラムを書く場合など)
しかし、最初のうちは、必要かどうかを区別すること自体が難しく感じられるかもしれません。ですので、区別ができるようになるまでは、「全てに書いておく」という方針でも良いかと思います。
(もし「using Utage;」と「public AdvEngine engine;」が不要なスクリプトに、それらを書いてしまったとしても、プログラムが動かなくなるということはありません。)
不要なスクリプトは書いておきたくない、と思う方は、
『engineから始まるスクリプトを書くときは、「using Utage;」と「public AdvEngine engine;」が必要』
という風に覚えておくと良いかと思います。
(もし、「using Utage;」と「public AdvEngine engine;」が必要なスクリプトに、engineから始まるスクリプトを書くと、エディター(Visual Studioなど)に「現在のコンテキストに 'engine' という名前は存在しません。」等のエラーメッセージが出てきますので、それによりAdvEngineの指定が必要なのだと気付くことができます。)