В некоторых документах Unity я читал, что Dictionary
не является сериализуемым, поэтому его нельзя изменить из редактора. Был намек на использование двух List
, а затем их использование для создания Dictionary
:
Подсказка: Unity не будет сериализовать словарь, однако вы можете сохранить список <> для ключей и список <> для значений и сшить их в несериализованном словаре на Awake().
Однако я, похоже, не могу найти документацию для этого. Пока у меня есть следующее:
public List<string> someKeys;
public List<Sprite> someValues;
private void Awake()
{
someDictionary = new Dictionary<string, Sprite>();
}
someKeys
и someValues
настраиваются и заполняются в редакторе Unity с тем же количеством элементов. Естественно, элемент 0 someKeys
является ключом для элемента 0 в someValues
, как и остальные остальные ключи по порядку. Как я могу теперь использовать их для создания ключей и значений в someDictionary
?
Обновление: из повторяющихся отметок видно, что на этот вопрос был дан ответ Linq
, который, будучи новичком на С#, я еще не использовал, но, безусловно, кажется, что он выполняет эту работу. Но будет ли это безопасным в Unity, особенно на таких устройствах, как iOS? Кроме того, будет ли этот метод лучше (т.е. быстрее и/или считается лучшей практикой, чем использование стандарта for
цикла?
Примечание. Я хочу получить доступ к Sprite
в someValues
по их ключу, а не по числовому индексу.
Класс Dictionary
- это общий класс с аргументом первого типа, соответствующим типу ключей и аргументу второго типа, типу значений.
Поэтому словарь должен выглядеть так: Dictionary<string, Sprite>
Затем вы можете добавить пару Dictionary.Add(key, value)
метода Dictionary.Add(key, value)
.
Итак, здесь у вас будет:
for (int numItem = 0; numItem < someKeys.Count; numItem++)
dictionary.Add(someKeys[numItem], somevalues[numItem]);
Но сначала убедитесь, что someKeys.Count == someValues.Count
.
Вы также можете использовать LINQ, но похоже, что iOS может иметь ограниченную поддержку LINQ (см. Использование LINQ при построении для iOS - Unity Answers)