InvalidCastException при работе с хэш-таблицей.
Доброго времени суток. Делаю сценку с процедурной генерацией объектов.
На объекте 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 - уже забыл.
В общем, я бы сделал так: Dictionary<string, Sector> и foreach (Sector s in sectors.Values)



Просмотров: 226

» Лучшие комментарии


GeneralElConsul #1 - 4 месяца назад 0
По-моему в foreach можно только читать s, а не изменять s.
alexprey #2 - 4 месяца назад 1
  1. Где находится 35 строчка? Вручную не получилось посчитать
  2. Если у тебя используется в качестве ключа всегда строка, используй Dictionary<string, Sector> или как-то так
GeneralElConsul #3 - 4 месяца назад (отредактировано ) 6

Всегда использую Dictionary вместо Hashtable и давно забыл, что там за траблы с преобразованиями.
Еще интересный вопрос в самом foreach: почему ты решил, что foreach вытянет из коллекции именно значения в виде объекта s, а не ключи или что-то еще?
Бери s из sectors.Values или используй foreach (DictionaryEntry de in sectors), где потом DictionaryEntry.Value - значение. И еще вопрос, надо ли будет делать явное преобразование из Object - уже забыл.
В общем, я бы сделал так: Dictionary<string, Sector> и foreach (Sector s in sectors.Values)
alexprey #4 - 4 месяца назад 0
И еще вопрос, надо ли будет делать явное преобразование из Object - уже забыл.
Ага, надо, он возвращает object