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

Re: Как объявить переменную с именем равным String?

СообщениеДобавлено: 18 июл 2017, 23:54
snezhok_13
Почитайте у Эндрю Троэлсена в книге про generics. Да и вообще ее почитайте) У вас очень новичковые вопросы

Re: Как объявить переменную с именем равным String?

СообщениеДобавлено: 19 июл 2017, 05:59
ru66ssb
создание своего класса - это очень правильно...сам пока еще только читаю литературу..но если нужно просто и быстро то вот :

Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class create : MonoBehaviour {

    public GameObject go;
    List<GameObject> gb = new List<GameObject>();
    List<Vector3> gbPos = new List<Vector3>();

        // Use this for initialization
        void Start () {
       

        for (int i =0; i < 6; i++)
        {
            gb.Add(go);
            gbPos.Add(new Vector3(i,0,0));
            Instantiate(gb[i], gbPos[i], Quaternion.identity);
            Debug.Log("Объект №" + i + " Позиция x - " + gbPos[i].x + " Позиция y - " + gbPos[i].y + " Позиция z - " + gbPos[i].y);
           
        }
        Debug.Log("Количество объектов всего - " + gb.Count);

    }

   
}

 


здесь мы имеем 2 списка List связанных между собой по индексу (gb[i] и координаты для него gbPos[i]). при работе с ними стоит быть внимательными - т.е. при добавлении/удалении gb так же нужно и делать с gbPos

Re: Как объявить переменную с именем равным String?

СообщениеДобавлено: 19 июл 2017, 14:31
Woolf
class create

Вот за такое надо бить линейкой по пальцам. Вы зачем такое название класса выбрали? Это уже, сразу на этапе проектирования, потенциальное обиталище бага с зарезервированными где-то словами. И вообще, названия классов принято писать с большой буквы. Еще, create - это действие, именем класса обычно выбирают не действие, а существительное. Если так хочется, то, например, Creature, но никак не Create.

т.е. при добавлении/удалении gb так же нужно и делать с gbPos

Еще одна ошибка проектирования. Ну вот кто мешает-то сделать структуру:

Синтаксис:
Используется csharp
public struct GoElement {
  public string ElmntName;
  public GameObject GOObj;
  public Vector3 pos;
}


и хранить эту структуру в листе, если так уж хочется:

Синтаксис:
Используется csharp
public List<GoElement> elmntList=new elntList<GoElement>();


И мы имеем для каждого объекта GO связанные с ним Vector3 и имя, если так уж хочется ТСу. Понадобится еще чего либо, например, несколько полей int, мы всегда можем это добавить в нашу структуру и наша структура и список от этого не развалится.
Единственный минус, что дефолтный редактор Unity не умеет такую структуру править в редакторе, решается написанием небольшого скрипта для редактора.

Re: Как объявить переменную с именем равным String?

СообщениеДобавлено: 19 июл 2017, 15:13
Anonymyx
Что вы имеете ввиду под "править"?
[System.Serializable] для структуры и этот лист будет виден в редакторе.
Или вы не про это?

Re: Как объявить переменную с именем равным String?

СообщениеДобавлено: 19 июл 2017, 15:45
Woolf
Anonymyx писал(а):Что вы имеете ввиду под "править"?
[System.Serializable] для структуры и этот лист будет виден в редакторе.
Или вы не про это?


Хм, возможно.. Но, вроде, я сталкивался, что редактор не умеет такие структуры сериализовать, но может быть я ошибаюсь. Если так, то еще и проще всё.

Re: Как объявить переменную с именем равным String?

СообщениеДобавлено: 19 июл 2017, 16:53
NOVA
Не хотелось бы отвлекать вас от вашей дискуссии, но я так и не понял как добавить данные в этот List. Гуглил честных 2 часа. И видимо не нашёл понятного примера. Образование высшее, гуманитарное))).

Синтаксис:
Используется csharp
public struct Trackers
    {
        public GameObject Tracker;
        public int TrackerCamIndex;
        public Vector3 TrackerCamPos;
    }
    List<Trackers> list = new List<Trackers>();

Re: Как объявить переменную с именем равным String?

СообщениеДобавлено: 19 июл 2017, 17:06
samana
Вы хотите добавить данные из кода, или через инспектор?

Re: Как объявить переменную с именем равным String?

СообщениеДобавлено: 19 июл 2017, 17:09
Anonymyx
Давайте для удобности создадим конструктор для нашей структуры:

Синтаксис:
Используется csharp
public struct Trackers
    {
        public GameObject Tracker;
        public int TrackerCamIndex;
        public Vector3 TrackerCamPos;

               public Trackers(GameObject tracker, int index, Vector3 position)
               {
               Tracker = tracker;
               TrackerCamIndex = index;
               TrackerCamPos = position;
               }
     
    }
 


Добавляем:
GameObject tracker = Instantiate(...);
...
list.Add(new Trackers(tracker, someIndex, Vector3.zero));

Т.е.:
list.Add(
Создаем новый экземпляр - new Trackers - наш новый элемент листа.
Дальше открываем скобки - это наш конструктор, туда можно передать данные
(объект, индекс, позиция
закрываем конструктор
)
И того:

list.Add(new Trackers(нашОбъект, егоИндекс, егоПозиция));

...
Это если через код.
Через инспектор:
Над созданием структуры, т.е. тут:
public struct Trackers
пишем это:
[System.Serializable]
Т.е.:
[System.Serializable]
public struct Trackers
{...

Делаем паблик лист:

public List<Trackers> trackers = new List<Trackers>();
И этот лист будет виден в инспекторе.

Re: Как объявить переменную с именем равным String?

СообщениеДобавлено: 19 июл 2017, 17:19
NOVA
Спасибище. Я тут пока ждал ответ только что умудрился нагуглить вот такую статейку, где тоже всё разжёвано.
http://tealeaf.mmailm.lclients.ru/page/2/18
Думаю на основе Ваших данных и этой статейки осилю наконец.

Зы. Осилил. Ура.

В классе
Синтаксис:
Используется csharp
[System.Serializable]
    public struct TrackerStruct
    {
        public GameObject Tracker;
        public int TrackerCamIndex;
        public Vector3 TrackerCamPos;
    }
       public List<TrackerStruct> Trackers = new List<TrackerStruct>();


В методе

Синтаксис:
Используется csharp
 public void AddTracker()
    {
        foreach (GameObject SingleCamera in Cameras)
        {
            GameObject tracker = Instantiate(TrackerPrefab, new Vector3(0, 0, 0), Quaternion.identity);
            tracker.name = "Tracker" + Trackers.Count.ToString()+ "." + SingleCamera.name;
            Trackers.Add(new TrackerStruct
            { Tracker = tracker, TrackerCamIndex = Cameras.IndexOf(SingleCamera), TrackerCamPos = Vector3.zero, });            
        }
    }

Re: Как объявить переменную с именем равным String?

СообщениеДобавлено: 19 июл 2017, 22:13
NOVA
В итоге я получаю кучу GameObjects с разными именами.
Изображение
А хотелось бы получить один GameObject со списком id камер и Vector3 для каждого id camera.

Примерно так.
Изображение
Получается надо создавать одномерный лист, а внутри какую-то структуру. У каждого трекера должны быть свои координаты, имя и Vector 3 для каждой камеры.

Re: Как объявить переменную с именем равным String?

СообщениеДобавлено: 19 июл 2017, 22:19
Anonymyx
Ну так не создавайте объекты :)
В структуре GameObject замените на string.


Trackers.Add(new TrackerStruct
{ Tracker = "Tracker" + someIndex, TrackerCamIndex = Cameras.IndexOf(SingleCamera), TrackerCamPos = new Vector3(x,y,z )};

Создание с Instantiate я для примера написал.
Или можете через инспектор.
Получается надо создавать одномерный лист, а внутри какую-то структуру. У каждого трекера должны быть свои координаты, имя и Vector 3 для каждой камеры.

Мы это еще 19 постов назад сделали. :ymparty:

Re: Как объявить переменную с именем равным String?

СообщениеДобавлено: 19 июл 2017, 22:23
NOVA
Аблин точно и добавить туда четвёртый параметр Vector3 для позиции в 3d координатах.