MRが楽しい

MRやVRについて学習したことを書き残す

Unityで特定オブジェクトの全ての子オブジェクトを再帰的に処理する

本日は Unity の小ネタ枠です。
Unityで特定オブジェクトの全ての子オブジェクトを再帰的に処理する方法です。
f:id:bluebirdofoz:20211210232627j:plain

オブジェクトの子オブジェクトを取得する

オブジェクトの子オブジェクトは以下のように取得できます。

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);
        }
    }
}

以下のようなサンプルシーンを作成し、親オブジェクトにサンプルスクリプトを設定します。
f:id:bluebirdofoz:20211210232651j:plain

MRTK の Toggle ボタンを配置してボタン押下時に SetActive 関数を true/false で呼び出します。
f:id:bluebirdofoz:20211210232703j:plain

動作確認

シーンを再生して動作を確認します。
f:id:bluebirdofoz:20211210232714j:plain

ボタンを押下すると、スクリプトを設定した Cube オブジェクトの子オブジェクトの Active が切り替わりました。
f:id:bluebirdofoz:20211210232724j:plain

再帰的に処理を行っているので子オブジェクトの子オブジェクトも全て処理が行われています。
f:id:bluebirdofoz:20211210232732j:plain