Unityのスクリプト操作で、子オブジェクトを操作したいときに、一気に全てのオブジェクトを取得するための方法を紹介します!
サンプルコードの前に動きの解説
今回、全ての子オブジェクトを取得するために、以下のようなコードを作ります。
[SerializeField]
private GameObject ParentObject;
private GameObject[] ChildObject;
private void GetAllChildObject()
{
ChildObject = new GameObject[ParentObject.transform.childCount];
for (int i = 0; i < ParentObject.transform.childCount; i++)
{
ChildObject[i] = ParentObject.transform.GetChild(i).gameObject;
}
}
インスペクター上で指定したオブジェクトの子オブジェクトを、全てChildObjectに取得することを目的としています。
動きとしては単純で、ChildObjectを「new GameObject[ParentObject.transform.childCount]」で子オブジェクト分の配列にして、後は「ParentObject.transform.GetChild(i).gameObject;」で子オブジェクトの上から順番に配列に設定していくだけです。
取得のためのサンプルコード
ここからは実際に動きのサンプルを見るためのスクリプトを作っていきます。新しいスクリプトの作成からC#のスクリプトを作り、コードの貼り付けを行ってください。
※今回は名前は「NewBehaviourScript」で作っています。別の名前で作るときは、クラス名をそのままにしないように気をつけてください。
■NewBehaviourScript
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour
{
[SerializeField]
private GameObject ParentObject;
private GameObject[] ChildObject;
// Start is called before the first frame update
void Start()
{
GetAllChildObject();
}
// Update is called once per frame
void Update()
{
}
private void GetAllChildObject()
{
ChildObject = new GameObject[ParentObject.transform.childCount];
for (int i = 0; i < ParentObject.transform.childCount; i++)
{
ChildObject[i] = ParentObject.transform.GetChild(i).gameObject;
}
}
}
動きを試すときは空のオブジェクトにアタッチしてお使いください!
使い方の参考
オブジェクトにアタッチした後は、「Parent Object」に、子オブジェクトを取得したい親のオブジェクトを設定します。
後は通常のGameObjectと同様に、色々な操作ができます。例えば以下のようにUpdateを書き換えれば、一定時間毎に全ての子オブジェクトのONとOFFが切り替わります。(全てのオブジェクト操作の時は、以下の参考のようにforeachかforを使うと便利です。)
// Update is called once per frame
int hoge;
void Update()
{
hoge++;
if(hoge <= 60)
{
foreach (var item in ChildObject)
{
item.SetActive(false);
}
}
else if(hoge <= 120)
{
for (int i = 0; i < ChildObject.Length; i++)
{
ChildObject[i].SetActive(true);
}
}
else
{
hoge = 0;
}
}
他にも「ChildObject[i].name」で子オブジェクトの名前を取得し操作を分けることや、テキストが設定されたオブジェクトなら、以下のような方法で書き換えを行うこともできます。
※「using UnityEngine.UI;」の宣言が必要です。
// 上のサンプルのelse書き換え
else
{
for (int i = 0; i < ChildObject.Length; i++)
{
ChildObject[i].GetComponent<Text>().text = "hoge";
}
hoge = 0;
}
まとめ
オブジェクトが取得できれば、後は通常のオブジェクト操作と同じように移動なども可能です。自由度と作業効率が一気に上がるので、ぜひやってみてください!