Страница 1 из 2

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

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

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

СообщениеДобавлено: 24 ноя 2019, 16:29
1max1

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

СообщениеДобавлено: 24 ноя 2019, 16:44
Telephonist
1max1 писал(а):https://docs.unity3d.com/ScriptReference/Transform.Find.html

Да, но если нужно сделать поиск по всей иерархии?

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

СообщениеДобавлено: 24 ноя 2019, 17:28
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")...
}

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

СообщениеДобавлено: 24 ноя 2019, 17:36
Telephonist
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")...
}


Спасибо!

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

СообщениеДобавлено: 26 ноя 2019, 15:49
~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"))
{
     //делаем всякие прикольные штуки
}
 


Не тестил )

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

СообщениеДобавлено: 26 ноя 2019, 16:10
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 может быть очень четким и удобным для чтения и записи, обычно требуется гораздо больше вычислительных ресурсов и особенно больший объем памяти, чем написание алгоритма вручную.

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

СообщениеДобавлено: 27 ноя 2019, 08:47
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++.

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

СообщениеДобавлено: 27 ноя 2019, 11:29
Niker
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

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

СообщениеДобавлено: 27 ноя 2019, 13:21
IDoNotExist
Niker писал(а):если руки из опы, то тут ничего не поможет.

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

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

СообщениеДобавлено: 27 ноя 2019, 14:30
Niker
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.

Давай, скажи, что они обкурились, когда это писали и они там вообще ничего не понимают...

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

СообщениеДобавлено: 27 ноя 2019, 16:17
seaman
Зависит от того как Вы написали алгоритм"вручную". Если просто заменить, например Where на foreach - много не выиграете.
Тут есть benchmark:
https://jacksondunstan.com/articles/2994

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

СообщениеДобавлено: 27 ноя 2019, 19:20
ilkalawson
:-@ ... опять пошли меренья наносекундами, в движке где все решает кол-во кадров.

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

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

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

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

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

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

А то есть LINQ всё же можно использовать? Что же ты сам свои принципы нарушаешь родной?