2012年9月28日金曜日

Unityプログラミング応用(エディタ編集)~その3

前回に引き続きプログラミング応用編として、Unityエディタの編集に関して学習していきたい。
リンク先のウェブサイトの記載と併せ、ポイント解説の翻訳を見比べてほしい:

http://catlikecoding.com/unity/tutorials/star

GUILayoutボタンはどのような働きをする?
メソッドのGUILayout.Buttonはボタンを表示し、かつクリックされたかどうか値を返す。普段使用するときはif構文のなかで呼び出しを行いそのコードブロックの中で必要な処理を行うようにする。
GUIメソッドのなかで実際に起きる流れであるが、デモのケースではOnInspectorGUIが一度ならず呼び出しが行われる。レイアウト処理、再描画、有効なGUIイベントの発生(よくあるケース)、等の際に呼び出しされる。マウスクリックイベントがボタン上で発生したときのみtrueを返す。
理解を深めるためにはDebug.Log(Event.current);をOnInspectorGUIメソッドの最後に追加するなど、テストすると良い。
通常は心配する必要がないが、テキスト生成など重い処理の際には認識する必要がある。必要性もないのに1秒あたりに何度も発生させたい処理ではない。

新しい配列要素は何が入る?
SerializedPropertyを通して新しい配列要素を挿入した場合、新しい配列要素はその一つ手前の要素の複製になる。もし最初の要素である場合はデフォルト値が入る。

ValidateCommandって何?
GUIイベントのひとつであるValidateCommandは特別のアクション(元に戻す、やり直し等)の発生を示す。ExecuteCommandに近い印象があるが、このコマンドタイプは別にあり、意味がわずかに違いつつ全く同じ目的で使用することになる。残念ながらどこでチェックをして、GUI設計の内容によってどちらかのイベントだけが発生して両方ともには発生してくれない。正直どうしてなのかは分からない。
そうすると安全に対処する方法は両方ともチェックすることだ。この場合にかぎっていえばValidateコマンドをチェックすることで要件は満たせているようだ。

breakって何? キーワードbreakを使ってループから抜け出すことが出来る。複雑な条件があって早い段階でループを抜け出したい場合に便利だ。
for(int i = 0; i < 100; i++) { if(i == 5) { break; } DoStuff(); }
と同じ結果になるのは:
for(int i = 0; i < 5; i++) { DoStuff(); }

foreachって何?
forループの便利な代替手段がforeachだ。通常のforループに比べてオーバーヘッドがあるので自分はゲームコードでは絶対使わない。だけどエディタコードで反復する整数が不要な場合は気にせず使用する。
foreach(Star s in targets) { s.UpdateStar(); }
と同じ結果になるのは:
for(int i = 0; i < targets.Length; i++) { Star s = (Star)targets[i]; s.UpdateStar(); }

OnSceneGUIはどうしてtarget引数が必要?
下位互換のためとおもわれる。マルチオブジェクトのエディットはUnity3.5から導入された。その前のバージョンはtargetしか変数がなかった。

ワールド座標にどうやって変換する?
ローカル座標をワールド座標に変換するためにはオブジェクト階層のTransformマトリクスを適用する。Unityはシーンのレンダリングで自動処理してくれるが、自ら行う必要があるケースが存在する。この場合はTransform.TransformPointメソッドを使う。

ローカル座標にどうやって変換する?
ワールド座標に変換する場合とまったく逆のステップをまったく逆順序で行う。Tranform.InverseTranformPointメソッドを使う。注意点としてワールド座標の場合はさきに回転(rotate)してそれからtranformを行ったが、元に戻すためには順序を逆にしてtransformを先に行って逆変換(invert transform)をローカル座標で行う必要がある。

スナップショットって何?
もし元に戻すステップを各々のGUIイベントに用意すると、ハンドルをドラッグする操作は何十もの修正ステップに対する元に戻す操作履歴が必要になってしまう。だから代わりにハンドルはオブジェクトのコピー、すなわちスナップショットを作成してして操作に対するひとつだけの元に戻す操作履歴ををその動作が終了したタイミングで登録する。SetSnapshotTargetはどのオブジェクトを用意すればよいかを取得できる。
すべてのUnityエディタGUI要素は本質的にこれと同じで、ハンドルのドラッグ、数値スライド、テキスト入力、あるいはその他の要素であれ同様である。
-----------

Unityエディタ編集は覚えることを面倒くさがらず、うまく使いこなすと結果的に生産性があげられる、というのがポイントだとおもう。

一人でも多くUnityのエディタ編集をマスターしよう!

0 件のコメント:

コメントを投稿

ブックマークに追加

このエントリーをはてなブックマークに追加

自己紹介

自分の写真
Unity3D公式マニュアル翻訳やってる人がスマホ(iPhone, Android)のゲーム開発しています。気軽に面白く初心者が遊べる内容がモットー。Blogでは開発情報をひたすら、Twitterではゲーム作成の過程で参考にしている情報を中心につぶやきます

ページビューの合計

過去7日間の人気投稿

ブログ アーカイブ