Помогите заполнить сложный словарь) [РЕШЕНО]

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

Помогите заполнить сложный словарь) [РЕШЕНО]

Сообщение greatPretender 31 дек 2016, 17:17

С добрым ... новым годом, в общем))
В общем, не могу без ошибок заполнить корректно словарь, подскажите как.
---- Суть:
в сцене 1 пустой ГО , в нём 3(допустим) пустых Го, в каждом из них 5(допустим) пустых ГО.
Т.е. это 3 маршрута , каждый с 5-ю вейпонтами.
---- Задача:
Нужно это всё засунуть в словарь, чтобы манипулировать в дальнейшем N-ым кол-вом маршрутов и M-ым кол-вом вейпоинтов.
От вейпоинтов достаточно только координат Vecto3.
Синтаксис:
Используется csharp
foreach (Transform trchild in trWays) { trWays это transform 1-ого ГО          
        countWays++;            // считаем кол-во маршрутов в сцене
//      dictWays = new Dictionary<int, List <Vector3>>{};      
// по каждому маршруту int д.б. Список из коорд-т Vector3 каждого вейпонта
        dictWays.Add (countWays, List<Vector3>);           
// добавляем коорд-ты всех точек всех маршрутов в словарь
        foreach (var item in dictWays) {
                if (item.Key == countWays) {
                        foreach (Vector3 tr in trchild.transform) {
                                item.Value.Add (tr);
                        }
                }
        }
}

пишет что-то типа
System.Collections.Generic.List<UnityEngine.Vector3>' is a `type' but a `variable' was expected
Думаю, что я не правильно как-то делаю инициализацию словаря, но по-другому как не знаю.
Последний раз редактировалось greatPretender 31 дек 2016, 21:53, всего редактировалось 1 раз.
greatPretender
Старожил
 
Сообщения: 526
Зарегистрирован: 23 сен 2015, 07:51

Re: Помогите заполнить сложный словарь)

Сообщение Cr0c 31 дек 2016, 17:35

Синтаксис:
Используется csharp
dictWays.Add (countWays, List<Vector3>);

Здесь надо в список добавлять список, а не тип.
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

Re: Помогите заполнить сложный словарь)

Сообщение greatPretender 31 дек 2016, 17:39

ээ.. Не понял, поясните, пжл.
Так чтоли:
Синтаксис:
Используется csharp
dictWays.Add (countWays, List<List<>>);
 

вся ко пробовал, ругается
greatPretender
Старожил
 
Сообщения: 526
Зарегистрирован: 23 сен 2015, 07:51

Re: Помогите заполнить сложный словарь)

Сообщение Cr0c 31 дек 2016, 17:41

Вот этот List<Vector3> - это тип. А new List<Vector3>() уже список.
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

Re: Помогите заполнить сложный словарь)

Сообщение greatPretender 31 дек 2016, 17:42

аа понял... т.е. мне получается заранее нужно объявлять кол-во List столько же сколько будет маршрутов.?
Блин, а я думал как раз избежать и Листы будут храниться в словаре, вроде так раньше это воспринимал.
А если у меня будет 100 маршрутов ?
Мне что, нужно их всех объявить до Start типо так:
Синтаксис:
Используется csharp
List<Vector3> = list1
List<Vector3> = list2
...
List<Vector3> = list100
greatPretender
Старожил
 
Сообщения: 526
Зарегистрирован: 23 сен 2015, 07:51

Re: Помогите заполнить сложный словарь)

Сообщение greatPretender 31 дек 2016, 17:43

Cr0c писал(а):Вот этот List<Vector3> - это тип. А new List<Vector3>() уже список.

ААА, ясно, уловил ) ща
greatPretender
Старожил
 
Сообщения: 526
Зарегистрирован: 23 сен 2015, 07:51

Re: Помогите заполнить сложный словарь)

Сообщение greatPretender 31 дек 2016, 17:46

пишет ошибку Object reference not set to an instance of an object
на строчку
Синтаксис:
Используется csharp
        dictWays.Add (countWays, new List<Vector3>());  // добавляем коорд-ты всех точек всех маршрутов в словарь
 
greatPretender
Старожил
 
Сообщения: 526
Зарегистрирован: 23 сен 2015, 07:51

Re: Помогите заполнить сложный словарь)

Сообщение Cr0c 31 дек 2016, 17:50

Алгоритмизация - наше всё! Структура хранения какая? Контейнер путей, в контейнере родители для каждого пути. Нашли всех родителей - столько списков и добавили. А потом в каждый список позиции каждой цепочки.
Синтаксис:
Используется csharp
int ways = transform.childCount;
for (int i=0; i<=ways; i++) {
 List<Vector3> lv = new List<Vector3>();
 // заполняем список вейпоинтами из дочерних к transform.GetChild(i)
 dictWays.Add(i, lv);
}
 
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

Re: Помогите заполнить сложный словарь)

Сообщение greatPretender 31 дек 2016, 17:56

Я честно говоря не понимаю смысл слова контейнер в программировании.
Разумеется, я находу сначала через Find главного ГО.
Потом пробегаюсь по его дочкам 1-го поколения первым циклом
Синтаксис:
Используется csharp
        foreach (Transform trchild in trWays) {                
 

а дальше по каждому детям каждой дочьки
Синтаксис:
Используется csharp
        foreach (Vector3 tr in trchild.transform) {
 
greatPretender
Старожил
 
Сообщения: 526
Зарегистрирован: 23 сен 2015, 07:51

Re: Помогите заполнить сложный словарь)

Сообщение greatPretender 31 дек 2016, 17:57

Понял. Попробую по вашему алгоритму: найти и добавить всех дочек,а потом уже перебирать детей дочек. Ща.
greatPretender
Старожил
 
Сообщения: 526
Зарегистрирован: 23 сен 2015, 07:51

Re: Помогите заполнить сложный словарь)

Сообщение greatPretender 31 дек 2016, 18:10

у меня просто здесь по-другому, я не могу воспользоваться вашей строчкой:
Синтаксис:
Используется csharp
int ways = transform.childCount;

, т.к. есть некоторый внуки, которых не надо учитывать, а childcount насколько я знаю, считает вообще всех дочек во всей иерархии у ГО
поэтому сейчас пытаюсь тут подлезть )
Поэтому я и делал всё в одном цикле, т.к. можно было обратиться к обоих поколениям дочек сразу )
greatPretender
Старожил
 
Сообщения: 526
Зарегистрирован: 23 сен 2015, 07:51

Re: Помогите заполнить сложный словарь)

Сообщение greatPretender 31 дек 2016, 20:15

Всё равно сейчас ругается на последнюю строчку той же ошибкой ((
дебаги до этой строчки все работают.
Не правильно чтоли как-то инициализировал словарь, понять не могу
Синтаксис:
Используется csharp
foreach (Transform trchild in trWays) {                
    countWays++;        // получаем кол-во маршрутов
}
for (int i = 0; i <= countWays; i++) {
    List<Vector3> lv = new List<Vector3> ();
    foreach (Transform tr in trWays.transform.GetChild(i)) {                   
       countPoint++;    // получаем кол-во вейпоинтов на i-ом маршруте
    }
    for (int j = 0; j < countPoint; j++){       // перебираем каждый вейпоинт, берём его Vector3
        vect = trWays.transform.GetChild (i).GetChild (j).transform.position;
        lv.Add (vect);
    }
    countPoint = 0;
    dictWays.Add (i, lv);
}
greatPretender
Старожил
 
Сообщения: 526
Зарегистрирован: 23 сен 2015, 07:51

Re: Помогите заполнить сложный словарь)

Сообщение Cr0c 31 дек 2016, 20:51

Синтаксис:
Используется csharp
public Dictionary<int, List<Vector3>> dictWays = new Dictionary<int, List<Vector3>>();

Так задавали словарь?
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

Re: Помогите заполнить сложный словарь)

Сообщение samana 31 дек 2016, 21:08

На всякий случай:
Синтаксис:
Используется csharp
Dictionary<int, List<Vector3>> allWaysDict;

private void find()
{
    allWaysDict = new Dictionary<int, List<Vector3>>();

    Transform ways = GameObject.Find("ways").transform; //находим главынй контейнер

    for (int i = 0; i < ways.childCount; i++)           // пробегаемся по его детям первого уровня
    {
        Transform waysChild = ways.GetChild(i);         //ссылка на ребёнка
        List<Vector3> wayPoints = new List<Vector3>();  //создаём лист векторов

        for (int j = 0; j < waysChild.childCount; j++)  //пробегаемся по детям ребёнка первого уровня
        {
            wayPoints.Add(waysChild.GetChild(j).transform.position);    //записываем позицию в лист
        }

        allWaysDict.Add(i, wayPoints);  // заполняем словарь
    }
}
 
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Помогите заполнить сложный словарь)

Сообщение greatPretender 31 дек 2016, 21:32

Cr0c писал(а):
Синтаксис:
Используется csharp
public Dictionary<int, List<Vector3>> dictWays = new Dictionary<int, List<Vector3>>();

Так задавали словарь?

Уфф, спасибо. Оказывается я не правильно чуть-чуть делал, а именно:
не List<Vector3>>(), а List<Vector3>()> , не заметил что теперь эти скобки же будут относиться к словарю , мндя)) хех
Всё норм теперь, всё робит, но странно...
дебагом сейчас вывел координаты одной из точки :
он показал такие (184.1, 12.8, 167.2), хотя у меня все вейпоинты имеют z =5, в данном случае должно быть y=5, но она 12,8
Юнька переводит всё потом в свои внутренние координаты чтоли?
greatPretender
Старожил
 
Сообщения: 526
Зарегистрирован: 23 сен 2015, 07:51

След.

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

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

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