コンポーネントの作成
タグ

ゲームオブジェクトを非アクティブにする

非アクティブにマーキングすることで、あるゲームオブジェクトをシーンから一時的に取り除くことができます。実行するには、スクリプトから非アクティブ化したいゲームオブジェクトの 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);
    }
}
コンポーネントの作成
タグ