【Unity】StartメソッドやUpdateメソッドはなぜ実行されるのか

実は、これらのメソッドは継承されているものではなく、リフレクションで実行されているわけでもありません
Unityエンジンの特殊な挙動によって実現されています

Unity公式の情報

MonoBehaviourを継承したクラス(スクリプト)が実行されると、Unityエンジンがそのスクリプト内にStartやUpdateなどの特別なメソッドがあるかどうかを調査し、その情報をリストで保存します
例えばスクリプトがUpdateメソッドを持っていたら「毎フレームUpdateを呼ぶべきスクリプトのリスト」に追加されるわけです。

ゲームが実行される際、Unityは単純にこのリストを順番に処理してメソッドを呼び出します。この仕組みのおかげで、メソッドのアクセス権がpublicであろうとprivateであろうと、メソッドが呼び出されることには関係ありません。

C#の継承やオーバーライドなどの仕組み文法)を使っているわけではありません

公式からの抜粋原文

任意の型のMonoBehaviourが初めてその基底のスクリプトにアクセスしたときに、スクリプティングランタイム(MonoもしくはIL2CPP)によって何かのマジックメソッドが定義されているかを調査され、この情報がキャッシュされます。もしMonoBehaviourが特定のメソッドを持っていたら所定のリストに追加されます。例えばスクリプトがUpdateメソッドを持っていたら「毎フレームUpdateを呼ぶべきスクリプトのリスト」に追加されるわけです。

ゲーム中は、Unityは単にこのリストをイテレーションしてメソッドを呼んでいきます – シンプルです。また、これがUpdateメソッドのアクセス権がpublicであろうとprivateであろうと関係ない理由でもあります。

用語

スクリプティングランタイム

ゲームロジックやイベントの処理をカスタマイズおよび制御するプログラム。UnityではC#スクリプティングランタイム(MonoやIL2CPP)がそれに当たります

マジックメソッド

StartメソッドやUpdateメソッドを指します
特定の名前とシグネチャ(引数の型や戻り値の型)を持つ特別なメソッドのことを指します。これらのメソッドは、Unityのスクリプティングランタイムによって自動的に呼び出されるため、「魔法のように」振る舞うことからこの名前がつけられました。これらのマジックメソッドを適切に実装することで、ゲームオブジェクトやコンポーネントに対する特定のイベントや振る舞いをカスタマイズできます。

イテレーション

リスト内の各要素を順番に処理することを指します

参考リンク

Unity

Posted by hidepon