UnityのMonoBehaviourクラスのUpdateはメッセージ

Unityのスクリプトリファレンスを見ると、MonoBehaviourのStartやUpdate等はpublic関数等とは別にメッセージと書かれている。メッセージとはなんだろうか?イベントハンドラのようなものだろうか?

Visual StudioでMonoBehaviourの定義に移動してみる。

MonoBehaviourクラスにはStartやUpdateメンバはない。

その基底のBehaviourクラスにもStartやUpdateメンバはない。

その基底のComponentクラスやObjectクラスにもない。結局基底には定義されていないメソッドだ。でもMonoBehaviourクラスの派生クラスに定義しただけで呼ばれる。

Updateはどのように呼ばれているのか「…System.Reflectionだ!そうだろう!!」…いえ、UnityはSystem.Reflectionを使ってメソッドを調べて毎回呼んでいる訳ではありません。
代わりに、任意の型のMonoBehaviourが初めてその基底のスクリプトにアクセスしたときに、スクリプティングランタイム(MonoもしくはIL2CPP)によって何かのマジックメソッドが定義されているかを調査され、この情報がキャッシュされます。もしMonoBehaviourが特定のメソッドを持っていたら所定のリストに追加されます。例えばスクリプトがUpdateメソッドを持っていたら「毎フレームUpdateを呼ぶべきスクリプトのリスト」に追加されるわけです。
ゲーム中は、Unityは短にこのリストをイテレーションしてメソッドを呼んでいきます – シンプルです。また、これがUpdateメソッドのアクセス権がpublicであろうとprivateであろうと関係ない理由でもあります。

https://blogs.unity3d.com/jp/2015/12/23/1k-update-calls/

MonoBehaviourの派生のUpdateメソッドは基底に定義されたメソッドではなく、定義されているかどうかをチェックされて、定義があれば呼ぶべきリストに登録されるメソッドだった。へぇ。

自身のクラスで定義してあれば別だが、定義していないメッセージ(AwakeやFixUpdate等)はIntelliSenceの候補に表示されない。

ビルドを開始しました...
------ ビルド開始: プロジェクト: Assembly-CSharp, 構成: Debug Any CPU ------
...\Assets\NewBehaviourScript.cs(14,10): info UNT0001: The Unity message 'Update' is empty.
...\Assets\NewBehaviourScript.cs(8,10): info UNT0001: The Unity message 'Start' is empty.
========== ビルド: 正常終了または最新の状態 1、失敗 0、スキップ 0 ==========

Visual Studioでビルドすると空かどうかチェックしているので空だと出力されなかったりする?

dnSpyで見ると、空でも出力されていた。使っていないときは自分で削除した方がよさそうだ。