web-dev-qa-db-ja.com

コンポーネント、動作、MonoBehaviourの違いは何ですか?そして、なぜこれらが分離されているのですか?

MonoBehaviourはBehaviorを拡張し、BehaviorはComponentを拡張します。これらのクラスが分離されている理由と、これらのクラスの意味的な意味を知りたいです。これらのクラスを分離する目的はありますか?また、BehaviorまたはComponentを直接拡張するクラスはありますか?

UnityでC#コードを作成するには、MonoBehaviourを使用する必要があることを私は知っています。しかし、私はゲームエンジンとしてのUnityのアーキテクチャに興味があります。

15
kyasbal

コンポーネント

Componentは、BehaviourMonoBehaviourの両方の基本クラスです。これは、GameObjectにアタッチできる任意のスクリプトの基本クラスです。

これは、ほとんどすべてのUnity build-inスクリプトの派生元です。これには、ColliderRigidbodyが含まれます。


動作

Behaviourについて知っておくべき最も重要なことは、それを継承するものはすべて有効または無効にできるということです。スクリプトを有効/無効にしたくない場合は、これからスクリプトを継承しないでください。

たとえば、Rigidbodyを有効/無効にすることはできません。これが、ComponentではなくBehaviourクラスから継承する理由です。

BehaviourComponentから継承します。


MonoBehaviour

MonoBehaviourについて注意すべき最も重要なことは、コルーチン、呼び出し、または物理OnCollisionEnter関数、Start、などのUnityコールバック関数を使用する必要がある場合に必要になることです。 OnEnableOnDisableなど。

MonoBehaviourBehaviourを継承しているため、スクリプトを有効/無効にできます。

これらのクラスを分離する目的はありますか?

はい、上記の回答のように、適切なコンポーネントから継承することでさまざまな機能を使用できるように、それらは分離されています。

コルーチン、InvokeInvokeRepeatingが必要で、スクリプトを有効/無効にできるようにしますか? MonoBehaviourから継承を使用します。

スクリプトを有効または無効にできるようにしたいが、コルーチン、InvokeInvokeRepeatingは必要ありませんか? Behaviourを使用します。

決して有効化/無効化してはならないスクリプトがある場合、それはComponentから継承する必要があります。

BehaviourComponentは、Unityによって内部的なものとして使用されることに注意してください。これらからスクリプトを継承しようとしないでください。

これらを分離する主な理由は、メモリを節約し、各コンポーネントのコードを保守しやすくするためです。これは、めったに使用しない機能の数千行のコードを記述するよりも優れています。それらを分離し、それらがメモリにロードされるとき、それらは実際に使用されており、メモリ内のスペースを無駄にしません。

また、BehaviorまたはComponentを直接拡張するクラスはありますか?

はい。

  • MonoBehaviourBehaviourから直接継承し、次にComponentから継承します。

  • ColliderComponentから直接継承します。次に、BoxColliderSphereColliderなどの非ベースコライダーはそのColliderから継承します。

14
Programmer