Как в скрипте найти обьекты которые имеют один и тот же другой скрипт и взаимодействовать с ними? Unity, C#

Есть скрипт "InteractionController" через него мне нужно найти обьекты содержащих скрипт "DoorLogic" но если просто создать клон обьекта, то взаимодействовать можно только одним из них, я знаю что нужно работать через массивы но не понимаю как именно.

Кусок скрипта "InteractionController":

[SerializeField] private DoorLogic door;

private void Start()
{
    door = GetComponent<DoorLogic>();
}

private void FixedUpdate()
{
    if(Player.transform.localScale.x == -1 )
    {
        RayDirection = Vector2.left;
    }
    else
    {
        RayDirection = Vector2.right;
    }

    Ray = Physics2D.Raycast(RayPoint.transform.position, RayDirection, 1f, Interactable);
    if(Ray.collider != null)
    {
        if(Ray.collider.CompareTag("door"))
        {
            AllowDoor = true;
        }
        else
        {
            AllowDoor = false;
        }
    }
}

public void Action()
{
    if(AllowDoor)
    {
        door.DoorOpen();
    }
}

Ответы (2 шт):

Автор решения: Kurwo Attano

Вариант первый:

Сделать List из ссылок на экземпляры, в Awake добавлять this как новый элемент, а в OnDestroy удалять. Тогда можно перебирать их все перебирая этот лист. Этот лист можно сделать static в скрипте DoorLogic, тогда обращаться к нему через имя класса.

Вариант второй:

Он более костыльный и очень не стоит его использовать, использовать GetComponentsInChild от трансформа парента всех объектов, тогда это вернёт все компоненты этого типа во всех чилдах и чилдах чилдов и тд, от трансформа где это вызывалось. Повторюсь, не стоит так делать...

ps: Дочитал надпись с вопросом как это делать

Список делать так в DoorLogic:

public static List<DoorLogic> Instances = new List<DoorLogic>();

Обращаться к нему из других скриптов так:

DoorLogic.Instances

Добавлять и удалять экземпляр:

private void Awake()
{
    Instances.Add(this);
}
private void OnDestroy()
{
    Instances.Remove(this);
}

Перебирать из других скриптов так:

foreach (DoorLogic item in DoorLogic.Instances)
{
    item.DoSomething();
}

Или так

for (int i = 0; i < DoorLogic.Instances.Count; i++)
{
    DoorLogic.Instances[i].DoSomething();
}
→ Ссылка
Автор решения: Nikel

Если я правильно понял, то задача заключается в том, что нужно с помощью луча найти все возможные двери впереди. Как вариант можна использовать Physics.RaycastNonAlloc или Physics.RaycastAll. В первом случае будет возвращать то количество попаданий, которое буде указано в аргументе RaycastHit[] results. Например, если требуется не больше трех объектов, то можно указать var results = new RaycastHit[3]. Во втором, то вернет просто все попадания, которые были. В дополнение, то для объектов Door можно присвоить отдельный LayerMask и Raycast будет возвращать только объекты с этим леером. Советую так же не использовать каст лучей в апдейте, лучше уже InvokeRepeating с не слишком большой частотой повторения.

→ Ссылка