[Unity]メンバ変数とインスペクタ

スクリプトへパラメータを指定したい場合、ソースコードに直接かきこむよりも、外部からその都度指定したほうが、再利用をしやすくなります。今回は、外部からパラメータを指定する方法を紹介します。

外部からパラメータを指定する

自作コンポーネント(スクリプト)のメンバ変数を「public」修飾子を利用することで、スクリプトを付加したオブジェクトのInspectorにメンバ変数へ値を指定するインターフェイスが現れます。

以下は自作コンポーネントの例です。

using UnityEngine;
using System.Collections;

public class scalingSphere : MonoBehaviour {
	public float scale = 1.0f;
	void Start () {
		transform.localScale = new Vector3(scale,scale,scale);
	}
}

このようなスクリプトを用意し、Sphereオブジェクトを2つ作り、それぞれ付加します。すると、付加したオブジェクトのInspectorを見ると、スクリプトの所に以下のようなパラメータが入力できるようになります。

param

それぞれのオブジェクトのScaleパラメータを「1」と「5」へ変更し、実行すると以下のように、実行時に大きさが変化します。

scaling

InspectorのScaleがスクリプトの「scale」と結びついていることが確認できます。

このように、Inspectorで値を変更することができると、個別にパラメータを設定することができ、スクリプトを複数用意するという行為が愚行であることが理解できると思います。

おまけ パラメータを賢くする

上記のパラメータの指定方法では、値をキーボードから直接入力するため、下限や上限がわかりません。そのような場合は一般的にスライダなどを利用して範囲を設定します。また、さまざまなGUIをInspectorで利用する必要がある場合などもあります。その場合、カスタムエディタの指定を利用します。

slide

カスタムエディタを利用する場合は、Assetディレクトリの中に「Editor」というフォルダを作り、その中にインターフェイスの定義を書きます。この「Editor」はインターフェイス用に特別な扱いのフォルダになるようです。

詳しくは以下のサイトを参考にして作成してください。

http://marupeke296.com/UNI_ED_No1_Inspector.html

その1 Isnpectorが変わる!
http://marupeke296.com/UNI_ED_No1_Inspector.html

今回はEditorディレクトリを作成し、その中に「scalingSphereEditor」というスクリプトを作成し、以下のソースコードを記述しました。

using UnityEngine;
using System.Collections;
using UnityEditor;

[CustomEditor(typeof(scalingSphere))]
public class scalingSphereEditor : Editor {
	public override void OnInspectorGUI(){
		scalingSphere ss = (scalingSphere)target;
		ss.scale = EditorGUILayout.Slider("Scale",ss.scale,1.0f,10.0f);
		EditorUtility.SetDirty(target);
	}
}

ポイント

using UnityEditor;

カスタムエディタを利用する場合は必須

[CustomEditor(typeof(scalingSphere))]

scalingSphereスクリプトに対してのカスタムエディタだと明示的に指定

public class scalingSphereEditor : Editor {

Editorクラスを継承することで、Inspectorのインターフェイスを変更可能にできる

public override void OnInspectorGUI(){
		scalingSphere ss = (scalingSphere)target;
		ss.scale = EditorGUILayout.Slider("Scale",ss.scale,1.0f,10.0f);
		EditorUtility.SetDirty(target);
	}

7行目、OnInspectorGUIをオーバーライドすると、Inspectorウインドウの描画内容を指定できる
8行目:tagetとは今現在対象のクラス(今回はscalingSphereクラス)のオブジェクトが格納されているので、scalingSphereクラスだとキャストしてやることで利用ができる。targetはObjectクラスなため、強制的にscalingSphereだと認識させる。
9行目:メンバ変数scaleはスライダーを利用すると指定する。
10行目:エディタの内容が決定したら、最後にその決定をUnity側へセットする

詳しくは上記のページを参照してください。

おわりに

インスペクタから色々な値を入力することができると、様々なケースで利用できます。特に、スクリプトの中で値を指定しないため、都合に合わせてパラメータを個別に変更することができます。例えば、敵のキャラクターを使って、雑魚キャラはヒットポイントが10、ボスキャラクターはヒットポイントが50といったように同じ動きをするスクリプトでも個性を与えることができます。是非、値は埋め込まずにインターフェイスから値を与えるようにしてみてください。