Доброго времени суток. Делаю сценку с процедурной генерацией объектов.
На объекте WOLRDвисит скрипт WorldController:Mono Behavior. В WorldController'е есть поле хэш-таблица sectors, которая заполняется во время работы Start () и обрабатывается в Update().
Суть в том, что есть некоторое кол-во объектов, которые генерируются не сразу, а в течении игры. Информация о них и хранится в хэш-таблице c помощью класса Sector. Собственно Sector.SectorObj это поле, ссылающееся на объект, который генерируется не сразу а при определенных условиях.
НО что-то я не так делаю, когда перебираю хэш-таблицу и пытаюсь сгенерировать эти самые объекты на сцене.
На объекте WOLRDвисит скрипт WorldController:Mono Behavior. В WorldController'е есть поле хэш-таблица sectors, которая заполняется во время работы Start () и обрабатывается в Update().
Суть в том, что есть некоторое кол-во объектов, которые генерируются не сразу, а в течении игры. Информация о них и хранится в хэш-таблице c помощью класса Sector. Собственно Sector.SectorObj это поле, ссылающееся на объект, который генерируется не сразу а при определенных условиях.
НО что-то я не так делаю, когда перебираю хэш-таблицу и пытаюсь сгенерировать эти самые объекты на сцене.
public class Sector
{
public bool created = false;
public bool active = false;
public string ID;
public GameObject SectorObj;
public Vector3 SectorPosition;
public Sector(Vector3 SectorPosition)
{
this.SectorPosition = SectorPosition;
ID = "Sector:: " + ((int)SectorPosition.x).ToString() + "; " + ((int)SectorPosition.z).ToString();
}
}
public class WorldController : MonoBehaviour {
public GameObject sectorPrefab;
public Hashtable sectors = new Hashtable();
void Awake ()
{
//Заполняем массив секторов, при этом мы не генерируем сами игровые объекты
for (int i = 0; i < s_count; i++)
{
for (int j = 0; j < s_count; j++)
{
float x = (float)i;
float z = (float)j;
Vector3 pos = new Vector3(x, transform.position.y, z);
Sector s = new Sector(pos);
s.ID = "Sector:: " + i.ToString() + ";" + j.ToString();
sectors[s.ID] = s;
}
}
}
void Update ()
{
foreach (Sector s in sectors)
{
if (s.created != true)
{
Vector3 pos = s.SectorPosition;
GameObject new_s = Instantiate(sectorPrefab, pos, Quaternion.identity);
s.SectorObj = new_s;
s.SectorObj.name = s.ID;
s.SectorObj.transform.parent = transform;
s.created = true;
}
else
{
if (s.active != true)
{
s.SectorObj.GetComponent<SectorController>().RenderTerrain();
s.active = true;
}
}
}
}
}
Принятый ответ
Всегда использую Dictionary вместо Hashtable и давно забыл, что там за траблы с преобразованиями.
Еще интересный вопрос в самом foreach: почему ты решил, что foreach вытянет из коллекции именно значения в виде объекта s, а не ключи или что-то еще?
Бери s из sectors.Values или используй foreach (DictionaryEntry de in sectors), где потом DictionaryEntry.Value - значение. И еще вопрос, надо ли будет делать явное преобразование из Object - уже забыл.
Бери s из sectors.Values или используй foreach (DictionaryEntry de in sectors), где потом DictionaryEntry.Value - значение. И еще вопрос, надо ли будет делать явное преобразование из Object - уже забыл.
В общем, я бы сделал так: Dictionary<string, Sector> и foreach (Sector s in sectors.Values)
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован AsagiriGen
Бери s из sectors.Values или используй foreach (DictionaryEntry de in sectors), где потом DictionaryEntry.Value - значение. И еще вопрос, надо ли будет делать явное преобразование из Object - уже забыл.