Получение массива неактивных дочерних объектов по их имени.

Программирование на Юнити.

Получение массива неактивных дочерних объектов по их имени.

Сообщение Telephonist 24 ноя 2019, 16:23

Есть объект со своими дочерними неактивными объектами. Пытаюсь создать массив Transform[], собственно, можно и GameObject[], в котором хранятся некоторые из дочерних объектов, исходя из их имени. Сложность заключается в том, чтобы получить именно те объекты, которые нужны. GameObject.Find не находит неактивные объекты. Да и способ этот очень не оптимизированный. GetComponentsInChildren, как я понял, не может фильтровать по имени. Буду благодарен за любую помощь.
Telephonist
UNец
 
Сообщения: 24
Зарегистрирован: 08 апр 2019, 14:05


Re: Получение массива неактивных дочерних объектов по их имени.

Сообщение Telephonist 24 ноя 2019, 16:44

1max1 писал(а):https://docs.unity3d.com/ScriptReference/Transform.Find.html

Да, но если нужно сделать поиск по всей иерархии?
Telephonist
UNец
 
Сообщения: 24
Зарегистрирован: 08 апр 2019, 14:05

Re: Получение массива неактивных дочерних объектов по их имени.

Сообщение 1max1 24 ноя 2019, 17:28

Синтаксис:
Используется csharp
static class ex
{
        public static Transform[] GetAllChilds(this Transform me)
        {
            List<Transform> result = new List<Transform>();

            for (int i = 0; i < me.childCount; ++i)
            {
                result.Add(me.GetChild(i));

                result.AddRange(me.GetChild(i).GetAllChilds());
            }

            return result.ToArray();
        }
}

Синтаксис:
Используется csharp
foreach (var child in transform.GetAllChilds())
{
    if (child.name == "asd")...
}
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Получение массива неактивных дочерних объектов по их имени.

Сообщение Telephonist 24 ноя 2019, 17:36

1max1 писал(а):
Синтаксис:
Используется csharp
static class ex
{
        public static Transform[] GetAllChilds(this Transform me)
        {
            List<Transform> result = new List<Transform>();

            for (int i = 0; i < me.childCount; ++i)
            {
                result.Add(me.GetChild(i));

                result.AddRange(me.GetChild(i).GetAllChilds());
            }

            return result.ToArray();
        }
}

Синтаксис:
Используется csharp
foreach (var child in transform.GetAllChilds())
{
    if (child.name == "asd")...
}


Спасибо!
Telephonist
UNец
 
Сообщения: 24
Зарегистрирован: 08 апр 2019, 14:05

Re: Получение массива неактивных дочерних объектов по их имени.

Сообщение ~AvA~ 26 ноя 2019, 15:49

Можно попробовать сделать более специфическое расширение
Синтаксис:
Используется csharp
using System.Linq;
using UnityEngine;

public static class
{
    public static Transform[] GetInactiveChildrenWithName(this Transform transform, string childName)
        {
        return
            transform
            .GetComponentsInChildren<Transform>()
            .Where(t => t.name == childName && !t.gameObject.activeSelf)
            .ToArray();
        }      
}

Использование
foreach (var child in transform.GetInactiveChildrenWithName("name"))
{
     //делаем всякие прикольные штуки
}
 


Не тестил )
Аватара пользователя
~AvA~
UNIверсал
 
Сообщения: 396
Зарегистрирован: 17 фев 2015, 13:09

Re: Получение массива неактивных дочерних объектов по их имени.

Сообщение Niker 26 ноя 2019, 16:10

~AvA~ писал(а):Можно попробовать сделать более специфическое расширение
Синтаксис:
Используется csharp
using System.Linq;
using UnityEngine;

public static class
{
    public static Transform[] GetInactiveChildrenWithName(this Transform transform, string childName)
        {
        return
            transform
            .GetComponentsInChildren<Transform>()
            .Where(t => t.name == childName && !t.gameObject.activeSelf)
            .ToArray();
        }      
}

Использование
foreach (var child in transform.GetInactiveChildrenWithName("name"))
{
     //делаем всякие прикольные штуки
}
 


Не тестил )


Избегайте использования LINQ
Хотя LINQ может быть очень четким и удобным для чтения и записи, обычно требуется гораздо больше вычислительных ресурсов и особенно больший объем памяти, чем написание алгоритма вручную.
Niker
UNIт
 
Сообщения: 58
Зарегистрирован: 27 сен 2019, 12:03

Re: Получение массива неактивных дочерних объектов по их имени.

Сообщение IDoNotExist 27 ноя 2019, 08:47

Niker писал(а):
~AvA~ писал(а):Можно попробовать сделать более специфическое расширение
Синтаксис:
Используется csharp
using System.Linq;
using UnityEngine;

public static class
{
    public static Transform[] GetInactiveChildrenWithName(this Transform transform, string childName)
        {
        return
            transform
            .GetComponentsInChildren<Transform>()
            .Where(t => t.name == childName && !t.gameObject.activeSelf)
            .ToArray();
        }      
}

Использование
foreach (var child in transform.GetInactiveChildrenWithName("name"))
{
     //делаем всякие прикольные штуки
}
 


Не тестил )


Избегайте использования LINQ
Хотя LINQ может быть очень четким и удобным для чтения и записи, обычно требуется гораздо больше вычислительных ресурсов и особенно больший объем памяти, чем написание алгоритма вручную.

Избегайте использования C#
Хотя C# может быть очень четким и удобным для чтения и записи, обычно требуется гораздо больше вычислительных ресурсов и особенно больший объем памяти, чем написание алгоритма на C++.
Аватара пользователя
IDoNotExist
Адепт
 
Сообщения: 1432
Зарегистрирован: 23 мар 2011, 09:18
Skype: iamnoexist

Re: Получение массива неактивных дочерних объектов по их имени.

Сообщение Niker 27 ноя 2019, 11:29

IDoNotExist писал(а):
Niker писал(а):
~AvA~ писал(а):Можно попробовать сделать более специфическое расширение
Синтаксис:
Используется csharp
using System.Linq;
using UnityEngine;

public static class
{
    public static Transform[] GetInactiveChildrenWithName(this Transform transform, string childName)
        {
        return
            transform
            .GetComponentsInChildren<Transform>()
            .Where(t => t.name == childName && !t.gameObject.activeSelf)
            .ToArray();
        }      
}

Использование
foreach (var child in transform.GetInactiveChildrenWithName("name"))
{
     //делаем всякие прикольные штуки
}
 


Не тестил )


Избегайте использования LINQ
Хотя LINQ может быть очень четким и удобным для чтения и записи, обычно требуется гораздо больше вычислительных ресурсов и особенно больший объем памяти, чем написание алгоритма вручную.

Избегайте использования C#
Хотя C# может быть очень четким и удобным для чтения и записи, обычно требуется гораздо больше вычислительных ресурсов и особенно больший объем памяти, чем написание алгоритма на C++.


У вас явно бомбит, это отношение имеет только к Unity.
А не в целом к c#.
Да и к тому-же, вы ошибаетесь по поводу c++, можно написать так, что и вовсе будет работать медленнее, чем c#.
Ужасная работа с памятью, если руки из опы, то тут ничего не поможет.
Так что, подлечитесь у доктора у вас явно диагноз. :D
Niker
UNIт
 
Сообщения: 58
Зарегистрирован: 27 сен 2019, 12:03

Re: Получение массива неактивных дочерних объектов по их имени.

Сообщение IDoNotExist 27 ноя 2019, 13:21

Niker писал(а):если руки из опы, то тут ничего не поможет.

Да, по вам это видно. Это у вас же LINQ тормозит.
Аватара пользователя
IDoNotExist
Адепт
 
Сообщения: 1432
Зарегистрирован: 23 мар 2011, 09:18
Skype: iamnoexist

Re: Получение массива неактивных дочерних объектов по их имени.

Сообщение Niker 27 ноя 2019, 14:30

IDoNotExist писал(а):
Niker писал(а):если руки из опы, то тут ничего не поможет.

Да, по вам это видно. Это у вас же LINQ тормозит.

Покажи, где я это написал? что прям тормозит? Оо.
Microsoft писал(а):Although LINQ can be very clean and easy to read and write, it generally requires much more computation and particularly more memory allocation than writing the algorithm out manually.

Давай, скажи, что они обкурились, когда это писали и они там вообще ничего не понимают...
Niker
UNIт
 
Сообщения: 58
Зарегистрирован: 27 сен 2019, 12:03

Re: Получение массива неактивных дочерних объектов по их имени.

Сообщение seaman 27 ноя 2019, 16:17

Зависит от того как Вы написали алгоритм"вручную". Если просто заменить, например Where на foreach - много не выиграете.
Тут есть benchmark:
https://jacksondunstan.com/articles/2994
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Получение массива неактивных дочерних объектов по их имени.

Сообщение ilkalawson 27 ноя 2019, 19:20

:-@ ... опять пошли меренья наносекундами, в движке где все решает кол-во кадров.
ilkalawson
UNIверсал
 
Сообщения: 412
Зарегистрирован: 19 янв 2015, 20:38
Skype: lawsonunity

Re: Получение массива неактивных дочерних объектов по их имени.

Сообщение Niker 28 ноя 2019, 01:49

seaman писал(а):Зависит от того как Вы написали алгоритм"вручную". Если просто заменить, например Where на foreach - много не выиграете.
Тут есть benchmark:
https://jacksondunstan.com/articles/2994

Да, что вы все с этими скоростями. Я ничего про это не писал.
Даже уж речь пошла за скорость, то for всех обует, ко всему еще и выход из цикла есть когда нужно, чего нет в LINQ.
Хотя foreach, тоже будет опережать LINQ.
Суть в том, что ресурсов хавает на порядок, а то и на 2 порядка выше.
ilkalawson писал(а)::-@ ... опять пошли меренья наносекундами, в движке где все решает кол-во кадров.

Скорее память решает.
Ее просто, тупо, может не хватить.
Ну это касается телефонов.
Комп - фиолетово, можно напичкать.
Niker
UNIт
 
Сообщения: 58
Зарегистрирован: 27 сен 2019, 12:03

Re: Получение массива неактивных дочерних объектов по их имени.

Сообщение IDoNotExist 28 ноя 2019, 08:11

Niker писал(а):Скорее память решает.
Ее просто, тупо, может не хватить.
Ну это касается телефонов.
Комп - фиолетово, можно напичкать.

А то есть LINQ всё же можно использовать? Что же ты сам свои принципы нарушаешь родной?
Аватара пользователя
IDoNotExist
Адепт
 
Сообщения: 1432
Зарегистрирован: 23 мар 2011, 09:18
Skype: iamnoexist

След.

Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12