はじめに
翻訳用のコンポーネントなどシーン内の各所に仕込んでおき、設定の切り替えによって特定のメソッドを実行するということをやりたいときがあります。
Observerパターンの仕込みを事前にしておくと楽なのですが、そんなに多くならないだろ・・・と思いつつ後になって数が多くて泣きを見ることもよくあります。
そんなときはシーン内の特定のコンポーネントを検索し、一括でメソッドを実行するのが便利です。
サンプル
以下サンプルです。
GetComponetArrayでシーン内の特定のコンポーネントを検索し、ExecuteAllでメソッドを実行します。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SampleComponent : MonoBehaviour
{
ComponentA[] allComponents;
// Start is called before the first frame update
void Start()
{
//ComponentAを検索しておく
GetComponentArray();
}
// Update is called once per frame
void Update()
{
}
/// <summary>
/// シーン内のComponentAを全て検索
/// </summary>
public void GetComponentArray()
{
// 非アクティブなオブジェクトも含めて全てのComponentAを取得
allComponents = FindObjectsOfType<ComponentA>(includeInactive: true);
}
/// <summary>
/// 全てのComponentAのExecuteMethodを実行
/// </summary>
public void ExecuteAll()
{
foreach (ComponentA component in allComponents)
{
component.ExecuteMethod();
}
}
}
FindObjectsOfTypeでは現在のシーン内から検索するので、
シーンを動的に切り替える場合には都度GetComponetArrayをコールして配列を更新してください。
デフォルトだと非アクティブなオブジェクトのコンポーネントは検索対象外になるので、非アクティブを含めて検索する場合にはFindObjectsOfTypeの引数に「includeInactive: true」を渡してください。
コメント