Как в скрипте найти обьекты которые имеют один и тот же другой скрипт и взаимодействовать с ними? 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 шт):
Вариант первый:
Сделать 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();
}
Если я правильно понял, то задача заключается в том, что нужно с помощью луча найти все возможные двери впереди. Как вариант можна использовать Physics.RaycastNonAlloc или Physics.RaycastAll. В первом случае будет возвращать то количество попаданий, которое буде указано в аргументе RaycastHit[] results. Например, если требуется не больше трех объектов, то можно указать var results = new RaycastHit[3]. Во втором, то вернет просто все попадания, которые были. В дополнение, то для объектов Door можно присвоить отдельный LayerMask и Raycast будет возвращать только объекты с этим леером. Советую так же не использовать каст лучей в апдейте, лучше уже InvokeRepeating с не слишком большой частотой повторения.