【Unity】GameObjectのactive状態を取得するときの注意点
▶
【Unity】3Dアクションゲームを作ろう!#7 ステージの作成(Skybox・落下判定)
▶
【Unity】3Dアクションゲームを作ろう!#8 ステージの作成(スイッチ・扉)
▶
【Unity】3Dアクションゲームを作ろう!#9 プレイヤーのHP管理
▶
【初心者Unity】JsonUtilityクラスでJSONを扱う方法
▶
【初心者Unity】スクリプトからコンポーネントを追加する方法
activeSelfとactiveInHierarchyの違いについて
シーン中のGameObjectが有効かどうかを取得できるプロパティに GameObject.activeSelf と GameObject.activeInHierarchy があります。
どちらもbool型のプロパティとなっており、基本的にはGameObjectが有効であればtrueを返しますが、親子関係を持つときの振る舞い方が異なります。
今回はその違いについて、ヒエラルキーの状態を見比べながら詳しく解説します。
なお、GameObject.active プロパティは旧式のため使用は非推奨です。
※使用しているUnityのバージョンは5.6.1f1です。
[Unity_317×90]
検証
テストシーンを作成して、二つのプロパティの違いを確認してみましょう。
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】3Dアクションゲームを作ろう!#7 ステージの作成(Skybox・落下判定)
▶
【Unity】3Dアクションゲームを作ろう!#8 ステージの作成(スイッチ・扉)
▶
【Unity】3Dアクションゲームを作ろう!#9 プレイヤーのHP管理
▶
【初心者Unity】JsonUtilityクラスでJSONを扱う方法
▶
【初心者Unity】スクリプトからコンポーネントを追加する方法
ゲーム制作関連のオススメ連載リンク
とっても手軽なゲーム制作体験!
Unityゲーム開発基礎
実際のリリースゲームを題材にしたハンズオンゲーム制作連載
実践unityゲーム開発