非アクティブにマーキングすることで,あるゲームオブジェクトをシーンから一時的に取り除くことができます。 実行するには,スクリプトから非アクティブ化したいゲームオブジェクトの activeSelf プロパティをチェックするか,インスペクターのアクティベーションチェックボックスをチェックします。
ゲームオブジェクトのアクティベーションチェックボックス
親オブジェクトを非アクティブにした場合,その全ての子オブジェクトの activeSelf 設定に対しても,非アクティブが優先(オーバーライド)されます。 従って,親以下の全階層が非アクティブになります。 ここで注意して欲しいのは,これが子オブジェクトの activeSelf プロパティの値を変えた訳ではないということです。 従って親が再びアクティブになれば,子は当初の状態に復帰します。 このことは,シーン中のある子オブジェクトが現在アクティブであるかどうかを,その activeSelf プロパティを調べることで判定することはできないということを,意味しています。 その代わりとして,親からのオーバーライド効果が考慮に入っている activeInHierarchy プロパティを使いましょう。
このオーバーライド作用は,Unity 4.0から導入されました。 それ以前のバージョンでは, SetActiveRecursively 関数があり,この関数が特定の親オブジェクトの子をアクティブにしたり非アクティブにしたりするために使うことができました。 しかしこの関数は機能の仕方が違っており,個々の子オブジェクトのアクティブ化設定を変更していました。 従って,ヒエラルキー全体をオンオフ切り替えることはできましたが,子オブジェクトが元々持っていた状態を覚えておくことができませんでした。 旧来のコードとの互換性を保つために, SetActiveRecursively はUnity 4.0のAPIにも残されていますが,その使用は推奨されませんし,将来取り除かれる可能性もあります。 もし子の activeSelf 設定を本当に変更しなければならないような特殊なケースの場合には,以下のコードを使ってください。:
// JavaScript
function DeactivateChildren(g: GameObject, a: boolean) {
g.activeSelf = a;
for (var child: Transform in g.transform) {
DeactivateChildren(child.gameObject, a);
}
}
// C#
void DeactivateChildren(GameObject g, bool a) {
g.activeSelf = a;
foreach (Transform child in g.transform) {
DeactivateChildren(child.gameObject, a);
}
}