本日は Unity の小ネタ枠です。
Unityで特定オブジェクトの全ての子オブジェクトを再帰的に処理する方法です。
オブジェクトの子オブジェクトを取得する
オブジェクトの子オブジェクトは以下のように取得できます。
GameObject parentObject = this.gameObject; foreach(Transform child in parentObject.transform) { GameObject childObject = child.gameObject; // 子オブジェクトに対する処理を行う }
再帰的に処理を行う
指定オブジェクトの親オブジェクトと全ての子オブジェクトを走査し、Active を切り替えるサンプルスクリプトを作成しました。
・AllChildObjectControl.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; public class AllChildObjectControl : MonoBehaviour { public void SetActive(bool a_OnOff) { // 現オブジェクトの全ての子オブジェクトのアクティブを切り替える RecursiveSetActive(this.gameObject, a_OnOff); } private void RecursiveSetActive(GameObject a_CheckObject, bool a_OnOff) { // 対象オブジェクトの子オブジェクトをチェックする foreach (Transform child in a_CheckObject.transform) { // 子オブジェクトのアクティブを切り替える GameObject childObject = child.gameObject; childObject.SetActive(a_OnOff); // 再帰的に全ての子オブジェクトを処理する RecursiveSetActive(childObject, a_OnOff); } } }
以下のようなサンプルシーンを作成し、親オブジェクトにサンプルスクリプトを設定します。
MRTK の Toggle ボタンを配置してボタン押下時に SetActive 関数を true/false で呼び出します。