« [Unity][Unity3d]とりあえずゲーム作る | トップページ | シロイヘヤ+クロイヘヤver0.80をとりあえず。 »

2013年4月24日 (水)

【Unity】【備忘録】コンポーネント間のメソッド呼び出しとパフォーマンス

Unityで実行するとき、コンポーネントが違うと少しめんどいので、
やり方をまとめて、どういう状況で使うのか整理しとこうかと。
大雑把に4種類、実行したいメソッドをTargetMethod()として以下。

1.GetComponent<T>() + TargetMethod():
注意:対象GameObjectを事前に参照する必要がある。Findするとゲロ重い。
×GetComponentが重い。
○1度ゲットしとくと後は使い放題。複数引数とれるし、メソッド実行自体は早い
【用法】初期化でGetできて、動的にGetする必要がない場合+メソッド実行が複数回ある場合
【実用例】オセロ盤で作ったGUIに対してひっくり返るたびにひっくり返るメソッドを実行したい場合

SendMessage("TargetMethod")
※対象GameObjectを参照する必要がある。
×引数が一つしか送れない
×戻り値とれない
×弱い型付けなので遅い
△インテリセンスの補完が効かない。ミスタイプしやすい。
○C#・JavaScript間みたいな、言語が違うデータのやりとりができる。
○GetComponent<T>()にくらべてなんぼか早い。
○オブジェクトに直接送れるので、ちょっと見やすい
【用法】1度だけ別コンポーネントに命令を送りたいときに。
【実用例】敵にダメージを与えた時(単発)

BroadcastMessage("TargetMethod")
※注意:BroadcastするクラスにTargetMethodっていう名前のメソッドがあると
それも実行される。無限ループに陥りやすいので、注意して運用する
※子に属するクラスじゃないとだめ。親だとSendMessageUpwards
×さらに遅い
○オブジェクト参照しなくていいのが楽。
○全体に同じイベントを発生させるのにとても楽。
【用法】イベントみたいにして使うのがいいんじゃないですかね。
【実用例】FF6とかみたいな2Dキャラが活躍するゲームとかで、
画面全体に影響するイベントを起こすときとか。
たとえば地震が起きると、立ってるキャラは飛び上がってびっくりする、
床は揺れる。アイテムは倒れる、とか。
あと、複数パーツから成り立つモデルとかに、各部分に微妙に違ったアクションとらせたいときとか。
ロボットっぽいモデルに排気イベント作って、それ用のアニメを各部で同時にとらせる、とかね。
ロボットだと、パーツ付け替えするために別モデル使うとかよく有りそうだし。

static TargetMethod() な感じで静的メソッドを使用する。
×使用する変数がすべてstaticじゃないとコンパイル通らない。
×使用するGameObjectが1個だけじゃないとかなり怪しい挙動をする
×設計をちゃんとしないとバグの元
○早い。最速。
○GameObject参照しなくていい=どこから使ってもロード時間がない。
【用法】シーン上で絶対に一つであることが確定的に明らかなオブジェクトに
【実用例】GameManagerとかの神クラスを作ったとき。

大雑把に速度はStatic>>GetComponet(初期化時のみ)>SendMessage>GetComponent(毎回実行)>BroadcastMessage()

結論:
速度を重要視するならガンガン神クラス作ってStaticで運用。
動的に生成するタイプやら同じ対象があるたくさんある場合(フィールドアイテムとか)ならSendMessage()
乗り物なんかの、一度ロードしたらずっと使う系はGetcomponentで一時変数にとっといて使いまわす。
引数複数とるときも、一度とった時に何度も命令送るときも、どっち使うか迷った時も。
全体イベントはBroadcast。正直忘れていい。

GetComponent,SendMessage共に対象オブジェクトの参照は必須。
それもパフォーマンス低下するかもしれないので一応気にしておく。

« [Unity][Unity3d]とりあえずゲーム作る | トップページ | シロイヘヤ+クロイヘヤver0.80をとりあえず。 »

ゲーム開発」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

« [Unity][Unity3d]とりあえずゲーム作る | トップページ | シロイヘヤ+クロイヘヤver0.80をとりあえず。 »