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


今月のUnity新着記事
【知ってると役に立つ】UnityのUpdate内で1回だけ実行したい処理の書き方
【知ってると役に立つ】Unityでシーンの切り替えを検出するイベントの使い方
【使ってみよう!】Unity2Dでクリックした方向に弾を飛ばすサンプル
【Unity】unitypackage(Custom Package)の作り方

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新着記事
【知ってると役に立つ】UnityのUpdate内で1回だけ実行したい処理の書き方
【知ってると役に立つ】Unityでシーンの切り替えを検出するイベントの使い方
【使ってみよう!】Unity2Dでクリックした方向に弾を飛ばすサンプル
【Unity】unitypackage(Custom Package)の作り方
  • このエントリーをはてなブックマークに追加

PAGE TOP