【Unity】GameObjectのactive状態を取得するときの注意点


activeSelfとactiveInHierarchyの違いについて


シーン中のGameObjectが有効かどうかを取得できるプロパティに GameObject.activeSelf と GameObject.activeInHierarchy があります。
どちらもbool型のプロパティとなっており、基本的にはGameObjectが有効であればtrueを返しますが、親子関係を持つときの振る舞い方が異なります。

今回はその違いについて、ヒエラルキーの状態を見比べながら詳しく解説します。
なお、GameObject.active プロパティは旧式のため使用は非推奨です。

※使用しているUnityのバージョンは5.6.1f1です。

検証


テストシーンを作成して、二つのプロパティの違いを確認してみましょう。

GameObject 1~3を用意し、親子関係を持たせます。

下記のスクリプトを用意し、GameObject 1~3にそれぞれ適用します。

public void Check () {
	Debug.Log(gameObject.name + " activeSelf : " + gameObject.activeSelf);
	Debug.Log(gameObject.name + " activeInHierarchy : " + gameObject.activeInHierarchy);
}

※GameObjectを無効にするとStartやUpdateメソッドは動作しないため、ボタンを押すとCheckメソッドが呼ばれるようにしました。

■まず、GameObject 1~3が全て有効な状態で、チェックを行います。
結果は以下の通りでした。

全てのGameObjectで、activeSelf と activeInHierarchy のどちらのプロパティも True を返しました。
全部有効なわけですし、当然の結果です。

■次に、GameObject 2 を無効にしてみます。
方法は単純に、インスペクターでOFFにします。

親子関係があるため、ヒエラルキー上ではGameObject 3も無効になります。

この状態で再びCheckメソッドを実行してみます。
結果は以下の通りでした。

特筆すべき点は、GameObject 3の activeSelf が True となることですね。

GameObject 3 は、ヒエラルキーでは無効になっていますが、自身のインスペクターではONになっています。

このようなケースでは、activeInHierarchy は False を返しますが、activeSelf は True を返します。

結論


GameObject.activeSelf は自身が有効であればTrueを返す。
GameObject.activeInHierarchy は親子関係に依存し、ヒエラルキー上の親が無効であれば、自信が有効であってもFalseを返す。

以上です。

最近よく読まれている記事

【Unityのプログラミング力向上】C# 練習問題 4
【Unityのプログラミング力向上】C# 練習問題 3

記事一覧にもどる

  • このエントリーをはてなブックマークに追加

PAGE TOP