[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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です