Влияние дочернего объекта на переменные родителя?
Есть у меня объект gun, к которому прикреплен полигональный коллайдер, обозначающий зону обстрела. Все объекты, попавшие в эту зону, добавляются в список.
void OnTriggerEnter2D(Collider2D goal) {
goalsList.Add(goal.gameObject);
}
К gun я подключил дочерний объект Visibility_Area, у которого есть своя "зона обзора" круговая (Круговой коллайдер 2D). На Visibility_Area висит скрипт, который добавляет все попавшие в триггер объекты в List.
void OnTriggerEnter2D(Collider2D goal) {
visArea.Add(goal.gameObject);
}
Как этот самый лист прочитать из родительского объекта(gun), чтобы проверить одновременное нахождение в обоих зонах? Или, может, есть другой способ передать информацию объекту gun, что какой-то объект попал в обе зоны одновременно?
Подобные вопросы уже были, но ничего из этого не смог осуществить, все равно не то.
Ребят, спасайте! Уже двое суток голову ломаю. Если как-то надо дополнить вопрос, закину нужную информацию.
Что уже опробовано:
Через childTrans = this.gameObject.transform.GetChild(0); child = childTrans.gameObject; ifGoal = child.ifGoalVis;
я получаю объект Visibiliry_Area. Но как теперь изъять из него список? Если я обращаюсь к нему теперь, например ifGoal = child.ifGoalVis, где ifGoal - переменная типа bool в родителе, а ifGoalVis - переменная типа bool в дочернем объекте, то .ifGoalVis подчеркивает красным и пишет ""GameObject" не содержит определения "ifGoalVis", и не удалось найти доступный метод расширения "ifGoalVis", принимающий тип "GameObject" в качестве первого аргумента.
Вот тут еще интересный способ, но я остановился в самом начале при создании UnityEvent. Он просто говорит >Не удалось найти тип или имя пространства имен "UnityEvent" (возможно, отсутствует директива using или ссылка на сборку). [Assembly-CSharp]<
Может, когда объект попадает в дочерний коллайдер(OnTriggerEnter2D(Collider2D coll), можно отправить какое-то сообщение с указанием этого объект родителю. Что-то вроде "В меня заехал объект coll.gameObject, добавь его в свой List"? А дальше уже работать с этим списком в родителе (что было бы идеально). Так возможно?
Ответы (1 шт):
Это было тяжело, но я додумался:
Мы работаем с объектом Gun (на нем висит Poligon Collider 2D) и его дочерним объектом Visibility_Area (На нем висит Circle Collider 2D).

К Gun прикреплен скрипт Attack:
public class Attack : MonoBehaviour {
public List<GameObject> goalsList; // Список объектов, которые входят в зону атаки
public List<GameObject> visList; // Список объектов, которые видит орудие
public List<GameObject> visGoalList; // Список объектов, которые видны и по которым можно стрелять
void Awake() {
goalsList = new List<GameObject>(); // Инициализация списка объектов, которые входят в зону атаки;
visList = new List<GameObject>(); // Инициализация списка объектов, которые видит орудие
visGoalList = new List<GameObject>(); // Инициализация списка объектов, которые видны и по которым можно стрелять
}
public virtual void OnTriggerEnter2D(Collider2D goal) {
goalsList.Add(goal.gameObject);
if(visList.Contains(goal.gameObject) == true) {
visGoalList.Add(goal.gameObject);
}
}
public virtual void OnTriggerExit2D(Collider2D goal) {
goalsList.Remove(goal.gameObject);
}
// Совершить выстрел (начать обстрел)
void shot() {
}
}
В Attack я инициировал три списка, которые заполняются по мере попадания объектов в тот или иной коллайдер. Также в этом классе имеется функция, заполняющая один из списков(goalsList), заодно она проверяет, нет ли данного объекта в зоне Visibility_Area (visList). Если есть, то заполняет и третий список (visGoalList).
К Visibility_Area прикреплен скрипт Visibility_Ar:
public class Visibility_Ar : Attack {
public Attack visArea; // Ссылка на родителя
public override void OnTriggerEnter2D(Collider2D goal) {
visArea.visList.Add(goal.gameObject);
if(visArea.goalsList.Contains(goal.gameObject) == true) {
visArea.visGoalList.Add(goal.gameObject);
}
}
public override void OnTriggerExit2D(Collider2D goal) {
visArea.visList.Remove(goal.gameObject);
}
}
Этот класс (скрипт) наследует класс Attack. В нем я создаю ссылку на родителя
. Далее, также, когда объект попадает в триггерную зону Visibility_Area, я добавляю его во второй список (visList), и проверяю, есть ли этот объект в первом списке (goalsList), чтобы добавить его в третий список (visGoalList).
Тадааааам!!! Теперь мы можем проверить два условия для стрельбы в объект в нужном секторе. Наше орудие заметило цель, и цель находится в зоне поражения.
Если все выглядит и реализовано топорно и можно это как-то модернизировать, буду рад внесению корректив.