Unityのゲームオブジェクトがアクティブかを確認する時の注意

記事内に広告が含まれています。

Unityのゲームオブジェクトが現在アクティブかどうかをスクリプトで調べ、アクティブであれば何らかの処理を実行させる。

といった場面はよくあります。

通常であればgameObject.activeSelfを使ってそのゲームオブジェクトがアクティブかどうかを調べる事が出来ます。

ですが、場合によってはactiveSelfを使うと間違った処理になってしまう事があります。

スポンサーリンク

activeSelf

ゲームオブジェクトのactiveSelfを調べればそのゲームオブジェクトがアクティブかどうかを調べる事が出来ます。

しかし、調べるゲームオブジェクトが他のゲームオブジェクトの子要素であって親のゲームオブジェクトが非アクティブだった場合に問題が発生します。

ヒエラルキー上で右クリック→Create Emptyで空のゲームオブジェクトを2つ作り、名前をParent、ChildにしChildをParentの子要素へとドラッグ&ドロップします。

親を非アクティブにしたヒエラルキー

↑のようにParentのインスペクタで名前の横のチェックボックスを外し非アクティブにします。

親のゲームオブジェクトのインスペクタ

↑がParentのインスペクタ

子のゲームオブジェクトのインスペクタ

↑がChildのインスペクタになり、Parentは非アクティブですがChildはアクティブの状態です。

この状態でそれぞれのゲームオブジェクトがアクティブかどうかを調べるスクリプトを作成しMain Camera等の他のゲームオブジェクトに設定します。

parentObjとchildObjには先ほど作成したゲームオブジェクトをインスペクタで設定します。

Startメソッドでそれぞれのゲームオブジェクトのアクティブを調べ出力しています。

親と子のゲームオブジェクトをactiveSelfで調べる

今回はMain CameraにActiveTestスクリプトを設定しインスペクタにParent、Childを設定し実行しました。

↑のようにParentは非アクティブ、Childはアクティブとなります。

このような状態であると親が非アクティブの時は子も非アクティブ扱いにしたい時に困ります。

activeInHierarchy

activeSelfの場合は自身がアクティブかどうかを調べ、親が非アクティブであろうとなかろうと関係がありません。

そこで親が非アクティブであれば子も非アクティブと判定したい場合はactiveInHierarchyを使用します。

↑のようにactiveInHierarchyを使った処理を追加します。

先ほどと同じようにParentは非アクティブ、Childはアクティブ状態にしUnityを実行し確認してみます。

activeSelfとactiveInHierarchyのテスト

↑のようにactiveInHierarchyを使った場合はChildはアクティブですが親のParentが非アクティブの為にfalseが返ってきています。

ゲームオブジェクトがアクティブかどうかを調べ処理を実行するかどうか分岐させる時に今回のような事ではまってしまうケースもあるかもしれないので、

知っておくと便利ですね(^_^)v

タイトルとURLをコピーしました