万年素人からHackerへの道

万年素人がHackerになれるまで殴り書きするぜ。

Unity Advent Calendar 2012 2日目 Title:「shinriyo流Unityベストプラクティス」

URL: http://atnd.org/events/34621

「Boo Language Advent Calendar 2012」と日程がかぶったので自己紹介は省略します。
普段はUnityScriptという悲しい運命ですので、こちらではC#で行いますね。
僕は万年素人なので、間違ってたら遠慮なくコメントやTwitterで指摘してください!

1. 例えば、UnityScriptを避ける。

「例えば、PHPを避ける。」とセキュリティ対策では話題となっていた。
ソースはIPA SEC セキュア プログラミング講座
UnityではUnityScriptを避けましょう。
プリプロセッサ定義も動きませんので、とくにiPhoneAndroidなどの開発には向いていません。
C#を必ず使いましょう。
※Booは趣味では面白いですけど、UnityScriptは趣味でも面白くないですよね?

2. ドキュメント
XMLのドキュメントを必ず書きましょう。
JavaにはJavaDocという便利な仕組みがありましたが、C#にも似た仕組みがあります。
詳細は省略します。
URL: http://www.atmarkit.co.jp/fdotnet/csharp_abc/csharp_abc_019/csharp_abc05.html
URL: http://dobon.net/vb/dotnet/programing/xmldocument.html

3. Resources.Load()の注意

第2引数には必ず型を入れましょう。

・良い例

Resources.Load("resource name", GameObject);

・悪い例
↓これはダサいですね。

Resources.Load("WindowItems/PresentItem") as GameObject;


4. GetComponentではジェネリックスを使おう。

GetComponentでは文字列でジェネリックスからもコンポーネントを取得する方が多いかもしれませんが、
コンポーネント名のジェネリックスからもできます。
文字列だと、
「string型-> Componentの名前から実際のComponentの取得」の手順を裏方で行なっていると思いますので、
遅くなるはずですね。
※実際にパフォーマンスを測っていないので、別の機会に検証します。ここでは省略します。

・良い例

GetComponent<ComponentName>();

・悪い例
↓文字列はだめですね。

GetComponent("ComponentName");

5. WWW型をyieldで返すメソッドでは、StartCoroutineで呼ぼう

StartCoroutine(Hoge());

6. 文字列をSplitするときは奇妙なことをせずParseつかおう

文字列型をSplitして配列に変換したい時に

"hoge_var".Split( "_"[0]);

なんてしませんか?"_"をchar型に変換しているのがわかりにくいと思います。
PythonとかRubyとかしてない人には。

なのでこうしましょう。(というよりコーディング規約?)

"hoge_var".Split( char.Parse("_") );

7. Find()メソッドはGameObjectのではなく、transformのFind()を使え

人間には楽なことをすると、コンピュータにとっては苦労することが多いです。
Ruby言語の作者のまつもとゆきひろさんがJavaRubyのコードの比較に関して、Rubyは人間が書くのが少ない分Javaより遅いという旨の事を言ってました。

例えば、Hogeに実際に記載したいスクリプトがあった場合にFugaのオブジェクトを探したいと思います。

Hoge-|- Foo
          |- Bar
          |- Fuga

GameObjectを探すときにこれをやたらと↓を使いたがる方がいるかもしれません。
・悪い例

GameObject.Find("Fuga");

これだと、自分自身のHogeやBarまでも裏方で検索してるかもしれません。

Unityの裏方の処理(予想)

Hoge ×-|- Foo ×
             |- Bar ×
             |- Fuga ◯こいつだ!!
transform.Find("Fuga").gameObject;

こうすれば、Hogeの真下にいるFugaが検索されるはずですね。
※ .gameObjectを書いてるのは、transform.Findの返り値がTransformになるので、
書かないといけないことは注意して下さい。

8. StartCoroutineの引数について場合によっては文字列だが基本的にはメソッド名を書こう

引数は文字列よりメソッド名を直接書いたほうがおそらく速いですね。

※実際に検証してないので、今度調べます。

StartCoroutine(HogeMethod());

しかし、コルーチンを中断する場合はこれだと止まりません。

StopCoroutine(HogeMethod());

止める必要があるときは文字列にします。・・・が、止めるのではないときはメソッド名にしましょう。
>cs|
StartCoroutine("HogeMethod");
|