ゲームオブジェクトは、非アクティブと印をつけることによってシーンから一時的に取り除くことができます。実行するには、スクリプトからそのゲームオブジェクトの activeSelf プロパティーか、インスペクターのアクティベーションのアクティベーションチェックボックスを使用します。
ゲームオブジェクトのアクティベーションのチェックボックス
親オブジェクトを非アクティブにする場合、そのすべての子オブジェクトの activeSelf 設定も、非アクティブにオーバーライドされます。したがって、親以下の全階層が非アクティブになります。ここで注意することは、これで子オブジェクトの activeSelf プロパティーの値が変わる訳では ない ということです。したがって親が再びアクティブになれば、子は当初の状態に戻ります。つまり、シーン内の子オブジェクトが現在アクティブであるかどうかは、その activeSelf プロパティーを調べても判定することはできないということを意味しています。代わりに、 activeInHierarchy プロパティーを使用します。このプロパティーは親からのオーバーライドの影響も反映しています。
このオーバーライド挙動は、Unity 4.0 から導入されました。それ以前のバージョンでは、SetActiveRecursively という関数を使って指定した親オブジェクトの子をアクティブ/非アクティブにしました。しかし、この関数は、個々の子オブジェクトのアクティブ設定が変わると異なる挙動をします。階層全体をオンオフに切り替えることはできますが、子オブジェクトの元の状態を記憶できません。古いコードとの互換性を保つために、 SetActiveRecursively は API を Unity 4.0 のままにしていますが、その使用は推奨されません。また、将来取り除かれる可能性もあります。もし子の 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);
}
}