GameObjectの表示と当たり判定の設定を行う(親子階層構造対応)
GameObjectには、Active状態を切り替える
SetActive
というメソッドがあります。
こちらでActive状態をfalseにした場合、対象オブジェクトのコンポーネントが全て無効となります。
この場合、例えばそのオブジェクトがAudioSouceなどを持ったオブジェクトだと、
再生中のSEも途切れてしまうため、場合によっては表示と当たり判定のみを無効にしたい事が
あると思います。
そこで、SetActiveSoftというメソッドを考えてみました。
public static void SetActiveSoft(this GameObject me, bool val){ var tr = me.transform; for(int i=0; i<tr.childCount; ++i){ SetActiveSoft(tr.GetChild(i).gameObject, val); } if(tr.renderer != null){ tr.renderer.enabled = val; } if(tr.collider2D != null){ tr.collider2D.enabled = val; } if(tr.collider != null){ tr.collider.enabled = val; } }
まず、SetActiveと同様に、GameObjectのメソッドとして利用できるように
Extensionで拡張しています。
Extensionについては、過去記事を参照下さい。
クラスのメソッドを拡張するExtensionの使い方 - Unityゲーム開発日記@長崎
対象GameObjectに対し、bool値を渡し
trueなら、全オブジェクトのコリジョンとレンダラーをtureに設定しています。
また、transformに紐づく子を再帰で全走査しています。
コリジョンに関しては、collider2Dやcolliderのコンポーネントがあるかを確認し
存在すれば、enabled値を設定します。