どうも、Reveです。
今回もUnity関係の備忘録兼Tipsです。
(それにしても、最近の投稿がUnityばっかりですね(^-^;)。もう少し別の分野でも記事が書きたい…。)
Unityでは、インスペクタと呼ばれる3DCGなどオブジェクトの設定を確認・変更できるパネルがあります。
(インスペクタの画像)
これが少し工夫をすることで、自作のスクリプト内にあるフィールド(変数)の数値をIDE(統合開発環境)を開かずに編集できたり、使い勝手をよくすることができます。
【インスペクタを拡張する理由】
ですが、何故インスペクタ上で変数を変えられるようにするのか。
一言でいえば、ちょっとした調整がすぐにできてとても便利だからです。
わざわざ「あのキャラクターの体力値をもう少し大きくしたい」といった小さな調整で、IDEからキャラに関するスクリプトを開いて数値を変えるのは時間も浪費しますし面倒です(最近のVisual Studioが特に重いもので…。まあ便利だから使いますがw)。
特に長いコードになると、変数を探す作業も時間がかかってしまい、ミスを犯す可能性も高くなるので、GUI上で変更する方がメリットが多いのです。
また、作成した後にUnityエディタ上でテストプレイなどをしてもらい、その場で値を調整してもらうといったことも可能なので、
プログラマでない人との共同作業にもうってつけなのです(さすがにコードを読ませて修正してもらうのはほぼ不可能なので)。
【インスペクタを拡張する手法】
(C#前提です。Javascriptは知らん)
とりあえずフィールドなどに属性(Attribute)をつけるだけ。
また、変数の型によってもインスペクタ上での見え方が変化します。なお標準では、数値や文字を入力するフィールドが出てきます。
あるいは、CustomEditorを駆使してエディタ拡張をすれば独自のインスペクタも作成できるのですが、
長くなってしまうので今回は割愛。
【そもそも属性(Attribute)って?】
プログラムに関するメタデータ、砕けて言えば追加の設定を付けるものです。
詳細は以下のリンク先を参照
– ++C++; // 未確認飛行 C
(C#に関するサイトではトップクラスです)
http://ufcpp.net/study/csharp/sp_attribute.html
使い方も簡単で、フィールド変数やクラスなどの上につけたい属性を書くだけでOK
1 2 3 4 |
; title="AttributeSample"]//... [SerializeField] //属性(SerializeField:クラス内で宣言した変数が、インスペクタ上に反映) int sampleField; //この変数がインスペクタ上に表示 //... |
【各設定の効果】
では、属性の使い方も分かったところで、早速その効果を見てみましょう。
当方がよく使うものを中心にまとめてみました。
[Attribute]
SerializeField
– 変数の入力欄をインスペクタ上に表示 (public変数にした時と同じ効果)
– privateやprotectedなどでも表示可能
– デフォルト値を代入すると、入力欄にもその値が予め入れられる(変更可)
– Unity標準にはないクラス使う場合は、後述のSerializableと併用
System.Serializable
– クラスをインスペクタ上に表示できるようにする(構造体には使えない)
– (a)対象のクラスにこの属性をつけ、(b)このクラス型で宣言したフィールドにSerializeFieldを与えることで、このクラス内部の変数が表示される(アクセシビリティに注意)
Range
– 変数の設定できる範囲を指定
– 入力がスライダーバー形式に
Multilines(TextArea)
– テキスト(string)の複数行表示が可能(改行が反映される)
– 二者の違いは、右端で折り返すかどうか(TextAreaが折り返す)
Header
– 上にタイトルをつける
– 設定値のカテゴリ分けに便利
Tooltip
– 変数名が書かれた部分にマウスポインタを置くと、その説明文が表示される
– 説明文は引数で記載
RequireComponent(typeof(“クラス名”))
– クラス自体に付属させる
– そのクラスに必要なクラスを指定できる
– この属性を付けたクラスをオブジェクトにつける際、必要なクラスがまだない場合は自動で一緒に取り付けてくれる。
– また、この属性付きクラスをつけたまま、要求される別のクラスを外そうとするとエラーメッセージが出る
[型宣言]
配列やリスト
– 要素数と、各要素の値を入力する
– 中の要素の表示/非表示が切り替え可能
bool型
– 入力がチェックボックス形式に
enum(列挙型)
– ドロップダウン形式
– enumを定義して、そのenum型の変数をpublic、またはSerializeField属性にする
Vector3(Vector2)、Rectなど一部のUnity標準クラス
– それぞれのクラスに応じた入力形式に
[そのほか]
UnityEngine.Events.UnityEvent
– 手軽にイベント(何かをきっかけに発生する処理)の実装が可能
– このクラスのフィールドを宣言し、そのフィールドがあるクラス内のメソッドでInvokeメソッドを呼び出せばイベント発生
– イベントの割り当て方は、uGUIでのボタンなどへのイベント設定と同じ方法
– UnityEventへ割り当てられるメソッドには制約があるため、それを配慮して中の処理を与えていく
1 2 3 4 5 6 7 8 9 |
; title="SampleUnityEvent"]//... [SerializeField] UnityEngine.Events.UnityEvent onSomethingHappen; //... void Update(){ if(条件を満たす){ if(onSomethingHappen != null) onSomethingHappen.Invoke(); //割り当てられたメソッドを上から順に処理 } } |
と、上記のAttributeをすべて一つに当てはめるとこうなります。
ごちゃごちゃじゃねーかw
まあ、こんな風にいっぺんに盛り込む必要はないのですが、仕様に応じて適したものを使っていけば
ゲーム開発の効率も断然よくなる(ようになるかも)。
この情報が開発の手助けに少しでも慣れば幸いです。
こちらのサイトなどにも属性(Attribute)のまとめが掲載されています。
– テラシュールブログ
(Unity関連サイトでは有名どころの一つですね)
http://tsubakit1.hateblo.jp/entry/2015/01/03/203843
– PanzerSoftのブログ
http://panzersoft.blog.fc2.com/blog-entry-51.html
あと、スクリプトでC#を使う場合、「プロパティ」をフィールド変数の代わりに使う方も多いと思いますが、
それをインスペクタで表示させる処理についての手法もありました。
特にコードテンプレートが便利そうなので、今度試してみたいですね。
http://qiita.com/RyotaMurohoshi/items/b64b36009ba652b21e2c
ただ、自動実装プロパティをインスペクタで表示できる機能も(Unityのデフォルト機能で)ほしいところです。
ちなみに、CustomEditorによるエディタ拡張は、また別の投稿でいろいろと紹介していければと思います。
コメント