Как найти GameObject (ниже в иерархии), начиная с корневого GameObject? - PullRequest
0 голосов
/ 02 июня 2019

Хорошо, это немного сложно объяснить.

  • Допустим, в вашей игре несколько персонажей.
  • Каждый персонаж (префаб) может иметь различную структуру кости и имена костей.
  • Некоторые GameObjects (в префабах) вы переименовали для простоты.(Например, у каждого персонажа есть GameObject с именем «Голова»)

Теперь, учитывая метод OnTriggerEnter(), вы найдете «корневой» GameObject от коллайдера.

С этого моментаКак найти GameObject "Head" в корне этого GameObject?

Имейте в виду, что каждый GameObject (персонаж) содержит Head.Вы хотите найти этот конкретный объект GameObject.

Код, который я пробовал: (который возвращает нулевую ссылку)

private void OnTriggerEnter(Collider char)
{
    var en = char.gameObject;
    var head = en.transform.Find("Head");
}

Возможно ли это сделать без явного указания каждой иерархии,каждый другой тип строения кости?

Ответы [ 3 ]

1 голос
/ 02 июня 2019

Find не спускается по иерархии Transform.Функция поиска будет выполнять поиск по заданному списку детей, ищущих именованное преобразование, только если дочерние элементы не найдены, возвращается ноль .Другими словами, он не будет смотреться на детях своих детей.Если вы хотите использовать Find на дочернем объекте, который уже является дочерним, то вы должны получить к нему доступ как путь, используя /, например.transform.Find("Body/Head").

В общем, ссылка на строку, подобная этой, - очень плохая идея. Один из способов сделать это - создать пустой скрипт (скажем, Head.cs) и прикрепить его к дочернему элементу родителя.Затем GameObject вместо поиска преобразования по строковой ссылке вы можете искать компонент Head.cs

Это будет выглядеть примерно так:

private void OnTriggerEnter(Collider collider)
{
   //Where Head is an empty script attached to the Head.
   var head = collider.GetComponentInChildren<Head>();
   //Do something... Logging the name for example
   Debug.log(head.transfrom.name);
}
0 голосов
/ 02 июня 2019

Вот более простой вариант:

public static Transform FindDeepChild (Transform aParent, строка aName) {

    var headList = collider.GetComponentInChildren<Transform>(true);

    foreach(var it in headList)
        if (it.name == "Head")
            return it;
    return null;

}

0 голосов
/ 02 июня 2019

Гелий был правильным в комментарии. Пожалуйста, поверьте ему или ей за их усилия!

Вот упрощенная версия ответа:

    public static Transform FindDeepChild(Transform aParent, string aName)
    {
        Queue<Transform> queue = new Queue<Transform>();
        queue.Enqueue(aParent);
        while (queue.Count > 0)
        {
            var c = queue.Dequeue();
            if (c.name == aName) return c;
            foreach (Transform t in c) queue.Enqueue(t);
        }
        return null;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...