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 で追加された。