【Unity】子オブジェクト数の変化を検知する

概要

子オブジェクトの個数が変化したときにスクリプトを走らせたくなりました(図1)。

図1.子オブジェクトの数が変化する状況


コード

Odin – Inspector and SerializerUniTaskを使っています。
CheckIfChildrenChanged.csという名前でスクリプトを作成し、次のコードを書きます。

using System.Threading;
using Cysharp.Threading.Tasks;
using Sirenix.OdinInspector;
using UnityEngine;
using UnityEngine.Events;

public class CheckIfChildrenChanged : MonoBehaviour
{
    [SerializeField, ReadOnly] private int _pollingIntervalMilliseconds = 200;
    [SerializeField, ReadOnly] private int _waitUntilMethodExecMilliseconds = 100;
    [Space] public UnityEvent<int> OnChildrenCountChangeEvent;


    private async void Start()
    {
        // 同期メソッドを開始する ※オブジェクト破棄時はUniTaskを終了するよう設定
        CancellationToken cancellationToken = this.GetCancellationTokenOnDestroy();
        await CheckChildrenChanged(cancellationToken);
    }

    private int _childCount = 0;
    private async UniTask CheckChildrenChanged(CancellationToken cancellationToken)
    {
        while (true)
        {
            await UniTask.Delay(_pollingIntervalMilliseconds);

            // UniTask終了処理
            if (cancellationToken.IsCancellationRequested) return;

            // Transformの子数が変化したとき
            if (_childCount != this.transform.childCount)
            {
                _childCount = this.transform.childCount;
                await UniTask.Delay(_waitUntilMethodExecMilliseconds);

                // イベントを実行する
                OnChildrenCountChangeEvent.Invoke(_childCount);
            }
        }
    }
}

そして、スクリプトをゲームオブジェクトにアタッチしたら、図2のように子オブジェクトの数が変化したときに実行したい処理を登録します。

図2.子オブジェクト数の変更を検知するスクリプト。赤丸部分に実行したい処理を設定

UnityEventの引数で子オブジェクトの数(int)を渡すようになっています。

作成者: rarafy

2013年くらいからUnityを触っているかもしれません。 特に書くこともありませんが、趣味は部屋の掃除です。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です