概要
子オブジェクトの個数が変化したときにスクリプトを走らせたくなりました(図1)。
コード
Odin – Inspector and SerializerとUniTaskを使っています。
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のように子オブジェクトの数が変化したときに実行したい処理を登録します。
UnityEventの引数で子オブジェクトの数(int)を渡すようになっています。