読者です 読者をやめる 読者になる 読者になる

Unity / VRゲーム開発日記@長崎

Unityを使ったVRのゲーム開発をやってます。

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値を設定します。



設定してるのは表示とコリジョンだけで、
他のコンポーネントにもアクセスでき、色々と応用は利くかと思います。