読者です 読者をやめる 読者になる 読者になる

【Unity】別スクリプトの変数・メソッド呼び出しについて

しばらくUnityを弄る機会が無さそうなので、一応別スクリプトの呼び出しに関してのメモを記録しておく。

最初人伝に聞いたやり方がGetComponentだったため、とりあえずこれでいいや程度の気持ちでGetComponentを使っていたんだけれど、オブジェクトの数量や呼び出し箇所が随分増えたので、これはイカンと調べてみたわけです。

今までのスタイルだと、例えば子オブジェクトが親オブジェクトの何らかのメソッドを呼ぼうとした際、

void Update()
{
  if (death) {
    parentObject.GetComponent<SomeScript> ().delete ();
  } else {
    parentObject.GetComponent<SomeScript> ().move ();
  }
}

という感じで、呼び出し毎に毎回ScriptをGetComponentしていたんだけども、何度もScriptを使うような場合は、Startの中でメンバ変数に取得してしまって、その値を使うほうが効率的みたい。

private SomeScript someScript;
void Start() {
  someScript = parentObject.GetComponent<SomeScript> ();
}
void Update()
{
  if (death) {
    someScript.delete ();
  } else {
    someScript.move ();
  }
}

コードもすっきりでとても幸せな気分になれます。
言われてみれば当然っぽい感じだけど、まかさScriptの型で変数を宣言出来るとも思っていなかったので、そんな方法があったのか!と少し驚きました。

他に有名な別スクリプトの呼び出し方法と言えばSendMessageだけど、そこまで処理速度は変わらないらしいので、GetComponentで統一してしまった方がいいと思う。
引数一つしか送れないし、後からコードを見なおした時に、GetComponentで外部の呼び出しをしていることが明確なほうが、保守がしやすいような気がする。

GetComponentとSendMessageの速度比較はUnityフォーラムでも行われていて軽くチェックしてみたけど、やはりそこまで優位差は無いような感じがした。

Unityのこの部分の仕様って案外面倒だと思うんだけど、どうにかならないのかな。


参考
【Unity】【備忘録】コンポーネント間のメソッド呼び出しとパフォーマンス: 順調に転がってます
ゲームは初心者にやさしく: 必見!Unity初心者が学ぶ「別スクリプトの変数やメソッドへの参照」
Which is faster, SendMessage or GetComponent?