Войти
UnityФорумПрограммирование

Обработка массивов на обьектах

#0
21:46, 12 мая 2022

Стоит задача брать объект и проходиться по List который содержит ссылки на другие объекты, в которых в свою очередь списки на ещё объекты.

Условно:
Объект 1
      List в скрипте на нём:
            Объект 2
            Объект 3

Берём объект 2 проходится циклом по его листу.

Объект 2
      List в скрипте на нём:
            Объект 4
            Объект 5

Соответственно первый объект 4. Проходится циклом по его листу.

Объект 4
      List в скрипте на нём:
            Объект 6
            Объект 7

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

И что-то я ни как не соображу, как все это провернуть?

#1
22:35, 12 мая 2022

https://habr.com/ru/post/337030/
https://habr.com/ru/post/504374/

#2
23:24, 12 мая 2022

Рекурсия?

#3
23:27, 12 мая 2022

Я бы предложил изучить деревья, но это тема не простая.

#4
(Правка: 0:10) 0:08, 13 мая 2022

А можно задачу конкретезировать, убрав условности типа объект лист и тд. Что именно вы хотите проходить и зачем? Из за этого может кардинально отличаться реализация. По тому, что у вас написано, у вас нет никаких динамических массивов, так как вы говорите про объекты и листы.

Что вы пытаетесь сделать?

#5
3:00, 13 мая 2022

Taliesien
Да, думал об этом, делал прикидки, но мало ли есть какой ещё способ, попроще.

Salamandr
Немного не ясно что конкретно с деревьями надо изучить.

FourGen
Система ремонта автомобиля. Я не хочу разбирать его последовательно как это делают обычно, а хочу разбирать его по узлам.
Условно, рама, на нее крепятся рессоры, на них мост, к мосту энергоаккумуляторы, колеса, на колеса шины.
Через иерархию это не решить, так как одна деталь может крепиться сразу к двум, вот надо создавать ссылки что к чему крепится и что на что навешано, чтобы если игрок взял рессору, то с ней снялся мост со всем его оборудованием, а потом собрался.

#6
9:27, 13 мая 2022

sledo
> одна деталь может крепиться сразу к двум
Это уже не дерево, а что-то типа ациклического графа. Вплоть до такого
Изображение
Если это убрать - получится обычное дерево
Изображение
Некая статья о графах. Подробно не читал, но там есть основная теория, способы задания, добавления/удаления вершин.
https://studref.com/326109/matematika_himiya_fizik/osnovnye_ponya… _opredeleniya
Здесь есть обход дерева:
https://medium.com/@dimko1/%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D… -ed54848c2d47

#7
10:24, 13 мая 2022

Развёрнутая рекурсия, типа такого:

    public class Class{
      List<Class> list;

      public static void Do(Class firstObj)
      {
        List<Class> list = new List<Class>() {firstObj};
        int i = 0;
        while(i < list.Count)
        {
          int prevCount = list.Count;
          for(int j = i; j < prevCount; j++)
          {
            var obj = list[j];
            // Obrabotka(obj);
            for(int k = 0; k < obj.list.Count; k++)
            {
              if(!list.Contains(obj.list[k])) {
                list.Add(obj.list[k]);
              }
            }
          }
          i = prevCount;
        }
      }

собираешь список всех объектов, которые надо обработать. На каждой итерации обрабатываешь новые и добавляешь в этот список дочерние объекты необработанных. Проверяешь, чтобы не обрабатывать объекты дважды - иначе можно уйти в бесконечный цикл, если у тебя есть циклические связи

#8
12:00, 13 мая 2022

>Sledo
Извиняюсь, более подробно не напишу, так как с телефона.
Вот так более понятно. Но судя по описанию, получается обычное дерево, как привел пример seaman во втором варианте.
Я бы реализовыва бы через массивы.
- набор массивов типов деталей допустим 100 массивов. Очень легко дополнять любой из них.
- узел  будет состоять из одномерного массива индексов номера массива деталей (из этих 100)
Как то типа:
1 массив рессор
2 массив фар
3 массив рулей

Узел состоит из индексов номеров массивов.
3, 1, 2
На руль типа mas[3]  крепится рессора типа mas[1] на рессору крепится руль типа mas[2]

Узлы тоже можно сделать через подобные вложения.

По крайней мере так доступ будет в 1 действие или максимум 1 массив индексов пройти.

#9
18:16, 13 мая 2022

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

UnityФорумПрограммирование