Unity オブジェクトの「アクティブ」とコンポーネントの「有効」
ワールドやアバターを構成する Unity のオブジェクトやコンポーネントは、配置したまま一時的に機能を停止させることが出来る。
VRChat では
- オブジェクトの active は
SetGameObjectActive
で設定する。 - コンポーネントの enable は
SetComponentActive
で設定する。 - いずれも引数の設定で、有効化(True)、無効化(False)、変更(Toggle)の操作ができる。
- 初期状態は上のキャプチャの位置のチェックボックスで設定する。
- 関連するトリガーとして
OnEnable
がある。
オブジェクトの「アクティブ」
ここからは VRChat から離れて、その前提となる Unity の知識を整理する。 (毎度混乱するので公式のマニュアルから知識を書き出してまとめてみる。混乱は歴史的事情なのかなぁ?)
GameObject
にはオブジェクトが動作するか(駆動されるか)どうかを意味する "active" という概念がある。- 親子木構造の中での active について
- マニュアル
コンポーネントの「有効」
- コンポーネントの「有効」の定義があるのは、
Component
クラスではなくそれを継承するBehaviour
。- 変数名は
enabled
- d が付く動詞の過去分詞形。
- (active の方は形容詞 active であって、動詞過去分詞形 activated ではない。)
- 変数名は
GameObject
の active と異なり別途の設定関数は無い。enabled
に直接代入するように書く。- 状態変化を受け取る関数
OnEnable
,OnDisable
が定義されているのはBehaviour
ではなく、それを継承するMonoBehaviour
- 関数名は正確には OnEnable と d が付かない。変数名と微妙に違う。
OnEnable
,OnDisable
はenabled
だけではなく、そのMonoBehaviour
が add されているGameObject
の active 状態も合わせて反映する。- 要するに「その
MonoBehaviour
が駆動されるかどうか」の状態変化をきちんと反映してくれる。 - 例えば親の
GameObject
のSetActive
呼び出しで、子に add されているMonoBehaviour
のOnEnable
,OnDisable
まできちんと呼んでくれる。 - OnEnable() のドキュメント は そのへん「This function is called when the object becomes enabled and active.」というように、 enabled と active がなんかごっちゃに書いてある。(初見分かりにくい。object に enabled の概念があるように読める。)
- 要するに「その
- マニュアル・チュートリアル
(おまけ) Awake, Start, OnDestroy
- (VRChat では登場しないので詳細省略)
- 記事紹介:
考察
- インスペクタでチェックボックスを持つコンポーネントと持たないコンポーネントがあるのは、継承元が
Behaviour
なのかComponent
なのかの違いと思われる。 - 理解が混乱する要因:
- VRChat の
OnEnable
について:OnEnable
トリガーの説明 「when the gameobject the VRC_Trigger component is attched to is enabled」は(も)かなりいい加減。 これではオブジェクトに enable があるように読めるし、VRC_Trigger 自身の enabled について何も言及していない。OnEnable
の発生条件はきちんと分かっていない。参考: http://vrcworld.wiki.fc2.com/wiki/OnEnable対になるOnDisable
が無い。OnDisable
が VRChat 2018.2.1 で追加された。