Unity: как найти все объекты с помощью определенного скрипта

Чтобы найти все объекты с определенным скриптом в Unity, вы можете использовать различные методы. Вот некоторые часто используемые подходы:

Метод 1: использование FindObjectsOfType

using UnityEngine;
ScriptType[] objectsWithScript = FindObjectsOfType<ScriptType>();

Этот метод использует функцию FindObjectsOfType, которая возвращает массив всех активных объектов в сцене, к которым прикреплен указанный скрипт. Замените ScriptTypeфактическим именем искомого скрипта.

Метод 2: использование GameObject.FindObjectsOfType

using UnityEngine;
ScriptType[] objectsWithScript = GameObject.FindObjectsOfType<ScriptType>();

Подобно предыдущему методу, этот подход использует GameObject.FindObjectsOfTypeдля получения всех объектов с указанным прикрепленным скриптом.

Метод 3: использование GameObject.FindWithTag и GetComponent

using UnityEngine;
GameObject[] objectsWithScript = GameObject.FindGameObjectsWithTag("YourTag");
List<GameObject> filteredObjects = new List<GameObject>();
foreach (GameObject obj in objectsWithScript)
{
    if (obj.GetComponent<ScriptType>() != null)
    {
        filteredObjects.Add(obj);
    }
}

В этом методе вы сначала находите все игровые объекты с определенным тегом, используя GameObject.FindGameObjectsWithTag. Затем вы перебираете каждый объект и проверяете, прикреплен ли к нему нужный скрипт, используя GetComponent. Объекты со скриптом добавляются в отфильтрованный список.

Метод 4: использование специального диспетчера сценариев
Вы можете создать собственный диспетчер сценариев, который отслеживает все объекты с помощью определенного сценария. Этот подход требует ручной регистрации и отмены регистрации объектов по мере их создания или уничтожения. Вот упрощенный пример:

using UnityEngine;
using System.Collections.Generic;
public class ScriptManager : MonoBehaviour
{
    private static List<ScriptType> objectsWithScript = new List<ScriptType>();
    public static void RegisterObject(ScriptType obj)
    {
        objectsWithScript.Add(obj);
    }
    public static void UnregisterObject(ScriptType obj)
    {
        objectsWithScript.Remove(obj);
    }
    public static List<ScriptType> GetObjectsWithScript()
    {
        return objectsWithScript;
    }
}

В этом методе вы создаете статический список в классе пользовательского менеджера сценариев, чтобы отслеживать все объекты с нужным сценарием. Каждый объект со сценарием регистрируется при создании и отменяет регистрацию при уничтожении.