月別アーカイブ: 2013年10月

[Unity3D][C#][Unity:Editor]GUILayout/EditorGUILayout/ObjectFieldまとめ

UnityEditorの出題2とGUILayoutやらEditorGUILayoutやら

引き続き、Editor拡張の会の出題と解答を参考に作成してます。

CodeIQにも出題されているのでやってみると面白いと思います。
日本Androidの会 秋葉原支部 Unity部 安藤 圭吾さんの問題に挑戦中!

[wp_ad_camp_1]

Q 2

  • お題:EditorWindow
    • ウィンドウを出現させて各パラメータの調整項目を出現させてね!
  1. EditorWindow継承クラスをGetWindow、またはCreateWindowで出現させる。
  2. OnGUIイベント内でEditorGUILayoutを使ってパラメータの反映をさせるためのUIを作成する記述をする。

GUILayoutはUnityの用意したゲーム画面用のGUIでやたらと重いクラス。
とはいえ3Dをバリバリ使う事が無ければそれほど気にならない。
GUILayoutにEditro部分のように描画させようとしても記述が増えてしまう。

EditorGUILayoutに名前部分の記述をさせるとこうなる

this.name = EditorGUILayout.TextField("名前",this.name);
EditorGUILayoutだとこんなにシンプル。
実際に表示される内容は、項目名と入力ボックス。入力をすると自動的に参照先に上書きされる。

GUILayoutに同じ事やらせるとこうなる

GUILayout.BeginHorizontal();<br />
GUILayout.Label("名前");<br />
this.str = GUILayout.TextField("Default Name");<br />
GUILayout.EndHorizontal();

お分かりいただけただろうか…。長い。

ただ、UnityEngine内にあるし、ゲーム画面側にも描画できるので覚えて居た方が良い。
実機デバッグでむちゃくちゃ重宝する。

そしてwindow.Show();は忘れずに。

Q 2 Pratical

  • 追加:基礎編に追加でテクスチャをD&Dする矩形を設けてくださいな。
    解答例

できませんでした。

回答例から何をすべきだったかを導きだす。
– テクスチャ格納メンバの追加
– テクスチャ格納領域の表示

テクスチャはUnityEngine.Texture2Dを使用することで解決できるが、問題はDrag&Dropする領域。
EditorGUILayoutを見てみるとオブジェクトを格納できるのは1つだけ。
EditorGUILayout.ObjectFieldを参照してみる。

実際、出題中もここは確認したのだけれど、そもそも格納メンバがTexture2Dというところまで到達できていなかったので、この項目を使うべきだとは思わなかった。これはUnityが用意しているObject型に対する造詣がまだまだ甘かったということの証左。精進します。

“`
Texture2D texture;

texture = (Texture2D)EditorGUILayout.ObjectField(texture, typeof(Texture2D), false, GUILayout.Width(64), GUILayout.Height(64));

“`

回答例をみてみると、EditorGUILayout.ObjectFieldの表示サイズを変更している。
第四引数、第五引数だ。これについては後述する。

ObjectFieldの引数について

ドキュメントの丸写しだけれども。
– label
– フィールドの戦闘にだすためのラベル
– obj
– 実際にターゲットになるオブジェクト
– objType
– オブジェクトのタイプ
– allowSceneObjects
– シーン内のオブジェクトを受け入れるか否か。後述。
– options
– 次の項目で解説。

allowSceneObjectsについて

これをfalseにすると、assetの一部のオブジェクトを参照していた場合、assetはシーン内の参照を保持する事は出来ない。
– ※訳あってんのか…?

試しにGameObjectを格納することができるフィールドを用意して試してみたところ、Trueにするとシーン内(Hierarchy)内からD&Dすることができ、selectボタンをクリックした際もAssetsとSceneが選択できる。
逆にfalseにするとDrag&Dropをしようにも矩形は反応してくれないし、selectボタンをクリックしてもAssetsのみしかタブが表示されない。

つまり、そういうこと。

Gitポケットリファレンス

[Unity3D][C#]MenuItemの第二引数は何?

UnityEdtorの出題1とMenuItemのまとめ

CodeIQにも出題されているのでやってみると面白いと思います。
日本Androidの会 秋葉原支部 Unity部 安藤 圭吾さんの問題に挑戦中!

[wp_ad_camp_1]

Q 1

  • お題:MenuItem
    • メニューに項目追加してください。

実装方法

よく使う難易度の低い出題。
メタデータを埋め込まなければならない。
メタデータはC#以外では聞き慣れなかったのでわからないひとにとってはけっこうしんどいのではと今更ながら思った。
– 参考:C#::属性

[MenuItem("directory/like/this")]
static void OnChoseMenu(){}

Q 1 Pratical

  • 追加:メニューアイテムから項目を実行することで、洗濯中のGameObjectに子オブジェクトを追加しなさい。
    解答例

肝になるのはValidate()関数。
ここの関数はBoolを返すのだけど、その返り値に応じて二つ目の関数が実行されるか否かが決定するというところ。
どういうながれでそうなってるのか、ドキュメントを見てみる。

Documentより

// Validated menu item.
// Add a menu item named “Log Selected Transform Name” to MyMenu in the menu bar.
// We use a second function to validate the menu item
// so it will only be enabled if we have a transform selected.
[MenuItem ("MyMenu/Log Selected Transform Name")]
static void LogSelectedTransformName ()
{
Debug.Log ("Selected Transform is on " + Selection.activeTransform.gameObject.name + ".");
}

この前半部分が本来実行させたい内容を記述している。
後半に実行させるにあたっての条件を記述している。
ここでTrueが返らないとメニューアイテムの項目がアクティブにならず、グレーアウト表示がなされる。

// Validate the menu item defined by the function above.
// The menu item will be disabled if this function returns false.

[MenuItem ("MyMenu/Log Selected Transform Name", true)]
static bool ValidateLogSelectedTransformName () {
// Return false if no transform is selected.
return Selection.activeTransform != null;
}

falseにすると挙動は変わらない。どういった処理の流れになるのか、色々ためしてみた。

2つ以上の項目名が同じでショートカットの文字列が違う

  • このとき、両方とも併存させることができるのでValidateにあたる関数はそれぞれ作成することができる。
  • ショートカット部分も含めて同じ文字列にしておかないと、Validate用の関数として認められない。

Validate用関数はいつ呼ばれているか

return する前にDebug.Log()を仕掛けたら、メニューが閉じられる瞬間にDebug.Logの記述がなされた。

内部的な処理そのものはメニューを開いたタイミングで走り、メニューを閉じると各UIにOnGUIが呼び出されてコンソールの記述が変更される、という流れなのだろう。

つまり、代に引数はあらかじめ実行するか否かの指定として機能していると仮定できる。

実処理用の関数でもtrueを指定するとメニューを開くだけで実行される

試しにvalidate後に実行される関数の第二引数をtrueにしたところ、メニューが開かれるだけで実行されてしまった。

デフォルトの値

パラメータを省略するとfalseになるようだ。

試しに同じ階層に返り値voidの同族性の関数を2つならべたところ、競合し、記述が後の方が採択された。
エラーは出なかった。

翻ってちゃんとした実装について

というわけで間違った使い方をいくつか書いてみた。

英語があまり堪能ではないので上述のような記述を見つける事が出来なかったけれども、やってみた結果、そういった理由のようなので、答えはそういうことなんだろう。

せっかくなので試した時に使ったコードも載せておく。

Unity4入門   最新開発環境による簡単3Dゲーム製作
浅野 祐一 荒川 巧也 森 信虎
ソフトバンククリエイティブ
売り上げランキング: 19,094

[C#]enumをint/stringにしたりint/stringからenumにしたり

[wp_ad_camp_1]

できました。

audio-technica ダイナミックヘッドホン ATH-W1000X

参考