今回はUnityのスクリプトで設定したフィールドの型によってインスペクタでどのように表示されるかを確認してみます。
よく使うのはintやfloat等の基本型ですが、Unity特有の型も指定しそれがどのように表示されるかも確認します。
スクリプトで色々なフィールドの型を宣言する
まずはスクリプトで色々な型のフィールドを宣言し、それを空のゲームオブジェクトに設定してインスペクタでどのように表示されるかを確認してみましょう。
スクリプトはC#で作成し、名前をInspectorValueとします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | using UnityEngine; using System.Collections; using UnityEngine.Events; public enum EnumData { enum1, enum2 } public class InspectorValue : MonoBehaviour { // 文字列型 public string stringValue; // 論理型 public bool boolValue; // 整数型 public int intValue; // 浮動小数点型 public float floatValue; // 列挙型 public EnumData enumData; // 色 public Color color; // グラディエーション public Gradient gradient; // アニメーションカーブ public AnimationCurve animCurve; // Vector3 public Vector3 vector3; // Quaternion public Quaternion quaternion; // Rect public Rect rect; // レイヤーマスク public LayerMask layer; // UnityEvent public UnityEvent uEvent; } |
作成していない他の型もありますが、とりあえずよく使うものや違いが大きいものを載せました。
このスクリプトを空のゲームオブジェクトに設定し、インスペクタで表示したものが
になります。
設定出来る項目がかなり変わりますね。
色々な値の設定が出来るようになったのでインスペクタを操作してどんな感じで設定出来るか確認してみましょう。
↑のようにそれぞれ変更出来るようになりました。
インスペクタで設定した値を取得してみる
さきほどインスペクタで値の設定をしたので、スクリプトからその設定した値を取得して使ってみたいと思います。
まずはヒエラルキー上で右クリック→3D Object→Cubeを選択します。
CubeにInspectorValueスクリプトを設定します。
今回はAnimationCurveとGradientの値を使ってみたいと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | MeshRenderer mesh; // アニメーションカーブ用カウント変数 int count = 0; // Use this for initialization void Start () { // ゲームオブジェクトのマテリアルのカラーをインスペクタで設定した値にする mesh = GetComponent <MeshRenderer> (); // mesh.material.color = new Color (color.r, color.g, color.b, color.r); // アニメーションカーブの設定値があればコルーチン開始 if (animCurve.keys.Length > 0) { StartCoroutine (CountAnimValue ()); } } // Update is called once per frame void Update () { // グラディエーションを使ってマテリアルのカラーを変更 mesh.material.color = gradient.Evaluate (Mathf.Abs (Mathf.Sin(Time.time))); } // コルーチンを使ってアニメーションカーブの値を出力 IEnumerator CountAnimValue() { while (true) { Debug.Log (animCurve.keys [count].value); count++; if (count >= animCurve.keys.Length) { count = 0; } yield return new WaitForSeconds (1f); } } |
Startメソッド内でMeshRendererを取得し、マテリアルの色を変えています。
アニメーションカーブのキーフレームが1つでもあればコルーチンをスタートさせています。
UpdateメソッドではグラディエーションのEvaluateを使って時間経過での値を取得しマテリアルの色を変更しています。
Evaluateの引数には0~1の値を設定する必要があるのでMathf.Sinで-1~1の値を取得し、それをMathf.Absで絶対値にしています。
同じCubeのマテリアルを変更するのでStart、Update内のマテリアルの色を変更している箇所のどちらかをコメント化し実行して確認してください。
またコルーチンを使ってアニメーションカーブで設定したキーフレームの値の出力を繰り返しています。
コルーチンに関しては
を参照してください。
ColorやGradientは先ほどのサンプル動画と同じように設定してください。
アニメーションカーブは
↑のような感じでいくつかキーフレームを作成します。
キーフレームはウインドウ内で右クリック→Add Keyで追加出来ます。
設定を終えたら実行して確認してみてください。
Colorを変更するとCubeがその色に変更されます。
Gradientは時間経過とともに色が変更されていきます。
AnimationCurveはキーフレームの値がコンソールに繰り返し表示されるようになります。
終わりに
今回は実用的な使い方はしていませんが、アニメーションカーブは時間経過とともに値を変更したい時に利用すると便利かもしれません。
例えば動くブロックがあり、ある程度不定期にY座標の位置を動かしたい時にアニメーションカーブを使ってキーフレームの値を使って到達位置を変えるといった時に使えます。
gradientの時と同じようにAnimationCurve.Evaluateを使うとアニメーションカーブによって値を変更する事が出来るので便利ですね。
使う用途は色々あると思いますが、いざこういう値を使いたい!と思った時にフィールドの型をどのように設定すればインスペクタでどのように項目が表示されるか?
というのを知っておくといいですね。