回答:
Updateの呼び出し方法
いいえ、Unityは、メソッドを呼び出す必要があるたびに、魔法のメソッドを見つけるためにSystem.Reflectionを使用しません。
代わりに、特定のタイプのMonoBehaviourに初めてアクセスしたときに、基礎となるスクリプトがスクリプトランタイム(MonoまたはIL2CPPのいずれか)で検査され、マジックメソッドが定義されていて、この情報がキャッシュされているかどうかが確認されます。MonoBehaviourに特定のメソッドがある場合は、適切なリストに追加されます。たとえば、スクリプトにUpdateメソッドが定義されている場合は、フレームごとに更新する必要があるスクリプトのリストに追加されます。
ゲーム中、Unityはこれらのリストを反復処理し、そこからメソッドを実行するだけです—とても簡単です。また、Updateメソッドがパブリックかプライベートかが問題にならないのはこのためです。
この方法で行われる理由については、主に読者(読者)にDMGregoryの回答を参照します。これは、2つの競合する事柄のバランスに要約されます。
新しい開発者は、それを機能させたいだけで、「これをイベントシステムに接続するにはどうすればよいですか」を理解する必要はありません。ただし、オーバーヘッドは最小限で、高速に実行されます。
ソリューションはおそらく、これらの2つの制約の範囲内で達成できる最良のものです。または、少なくとも、当時Unity開発チームが思いついた最高のものです。知らないかもしれません。
MonoBehaviour基本クラスで抽象としてメソッドを定義し、サブクラスにそれを実装させるだけです。
Unityが使用するシステムの利点の1つは、60を超えるすべてのMonoBehaviourメッセージを実装する必要がないことです。
通常、必要なのは、これらのメソッドの1つまたはごく一部です。一部は2D / 3D物理に固有であり、一部はカメラまたはパーティクルシステムに固有であるため、1つのスクリプトですべてが必要になることはほとんどありません。
不要なメッセージを未実装のままにしておくことで、「このオブジェクトでOnCollisionStay2Dを呼び出さなくても、必要ない」ということをランタイムに明確に伝えることができます。
これにより、効率が大幅に向上します。これで、エンジンはショートリストをフィルターに掛けて、フレーム内のカスタム更新ロジックが必要なシーン内の〜20オブジェクトのみでUpdateを呼び出すことができます。