activeInHierarchy
gameObject.activeInHierarchy と gameObject.activeSelf はどちらもオブジェクトの有効状態を確認するプロパティですが、使い方や意味合いが異なります。
gameObject.activeSelf
-
意味:
現在のGameObject自体が有効(アクティブ)かどうかを示します。 -
効果:
gameObject.SetActive(true)またはgameObject.SetActive(false)によって直接変更されるのはこのプロパティです。 -
例:
gameObject.activeSelfがfalseなら、このオブジェクトはシーン内で無効になっており、子オブジェクトも無効になります。
gameObject.activeInHierarchy
-
意味:
GameObjectがヒエラルキー内で有効(アクティブ)かどうかを示します。 -
効果:
自分や親のどれかが無効であれば、このプロパティはfalseになります。 -
例:
親オブジェクトが無効 (SetActive(false)) になっている場合、その子オブジェクトはactiveSelfがtrueでもactiveInHierarchyはfalseになります。
使い分けの例
例えば、以下のような状況を考えてみます。
ParentObject (SetActive: false)
└── ChildObject (SetActive: true)
-
ParentObjectの場合:activeSelf:false(自身が無効化されている)activeInHierarchy:false(ヒエラ ルキー内で無効)
-
ChildObjectの場合:activeSelf:true(自身は有効化されている)activeInHierarchy:false(親が無効なのでヒエラルキー内で無効)
どちらを使うべきか
-
特定のオブジェクト自体の有効状態のみを確認したい場合は
activeSelfを使います。 -
シーン内で実際に表示されるかや動作するかを確認したい場合は
activeInHierarchyを使います。
void CheckGameObjectStatus(GameObject obj)
{
if (obj.activeSelf)
{
Debug.Log($"{obj.name} は自分自身がアクティブです。");
}
else
{
Debug.Log($"{obj.name} は自分自身が非アクティブです。");
}
if (obj.activeInHierarchy)
{
Debug.Log($"{obj.name} はヒエラルキー内でアクティブです。");
}
else
{
Debug.Log($"{obj.name} はヒエラルキー内で非アクティブです。");
}
}