2015-09-12 16 views
5

Unity3dには、すべてのスクリプトの通常の基本クラスであるMonoBehaviourクラスがあります。スクリプトを実装するときは、Awake()またはStart()またはUpdate()などのメソッドを実装する必要があります。なぜMonoBehaviourメソッドはオーバーライドのために実装されていませんか?

しかし、これらの方法はMonoBehaviourクラスにvirtualまたはabstractとして実装されていない1つはoverrideそれらを簡単にできるように。実際には実装されていません。モーメントで書いた方法は、クラスがあらかじめ持っていなかった新しいメソッドです。

これらのメソッドが基本クラス(MonoBehaviour)のvirtualまたはabstractとして実装されていないのはなぜですか?

答えて

6

ドキュメントを確認すると、それらの「機能」がすべて「メッセージ」セクションに表示されます。 MonoBehaviour Doc

「機能」(Start、OnEnable、Awakeなど)は、メソッドとしてではなくメッセージとして実装されています。

ここで、MonoBehaviourは、Componentを継承し、SendMessageメソッドを継承しています。Behaviourを継承しています。このメソッドは、基本的に、メッセージ/メソッドが存在するかどうかをエラーを報告するオプション付きのメッセージ/メソッドを呼び出します。名前メッセージ/メソッドのパラメータは文字列なので、そこでは反射を使用しています。

舞台裏でユニティのように見えるのは、それらのメッセージが呼び出されたかどうかを判断するためにそれらのメッセージが実装されているかどうかを判断することです。このUnityAnswerによると:

Unityは主にC++で書かれているので、ほとんどの魔法が ネイティブコードで起こります。 Unityはあなたのスクリプト がコンパイルされた後で、あなたが実装したこれらの "イベント"のどれかと、 がこのクラスのために覚えていることを反映するためにリフレクションを使用します。 UnityはUpdate/LateUpdate/ OnGUIが実装されている場合にのみコールします。

したがって、短い答えは、オーバーライドする必要のある「実際の」方法ではなく、実装されている場合にのみ呼び出されるメッセージです。

関連する問題