Один из быстрых способов получить пары ключ-значение в инспекторе Unity - определить сериализуемый класс записей, а затем использовать их массив или List <>. например...
public class SpellAnimationMap : ScriptableObject
{
[System.Serializable]
public class SpellAnimationEntry
{
public Spell spell;
public AnimationClip animation;
}
public SpellAnimationEntry[] spellAnimations;
}
Автоматически, это даст вам изменяемый размер списка в инспекторе, где вы можете ввести ключ и значение, без необходимости написания специального инспектора.
Результат выглядит так:
(Один прием: если в сериализованном классе записей есть поле «Имя», эта строка будет отображаться вместо полных заголовков «Элемент 0». Это полезно, если у вас есть более сложные данные, которые вы хотите эффективно перемещать.)
Создание этого объекта ScriptableObject позволяет вам рассматривать его как актив, совместно используемый типами / экземплярами сущностей, которым необходим одинаковый набор анимации, избегая дублирования списка для каждого. (Другие классы, как правило, сериализуются для каждого экземпляра в Unity). Чтобы пойти по этому пути, вам нужно добавить небольшой скрипт-редактор, который позволит вам создавать их экземпляры в папке «Ресурсы» .
Изменить: теперь это еще проще - вы можете просто добавить этот атрибут над ScriptableObject:
[CreateAssetMenu(fileName = "fileName.asset", menuName = "Some Folder/Menu Label")]
Это помещает ScriptableObject в меню «Создать», например:
При желании можно сделать массив частным и сериализованным, чтобы он по-прежнему отображался в инспекторе, но добавить общедоступный словарь (или частный словарь с общедоступным методом GetAnimation (Spell spell)), который клиенты будут использовать для более эффективного поиска. В своем методе OnEnable () SpellAnimationMap может перебирать свой массив, заполненный инспекторами, для создания этого словаря, снова разделяя преимущества между всеми клиентскими экземплярами. (Обратите внимание, что OnEnable () также вызывается в редакторе при первом создании ресурса, поэтому убедитесь, что ваш массив не равен NULL, прежде чем пытаться его прочитать)
Наконец, вы можете добавить столько данных в этот тип ввода, сколько вам нужно. Например, он может включать в себя также префаб или любое количество других битов данных, которые вы хотите связать с клавишей заклинания.
Можно также написать пользовательских инспекторов для непосредственного заполнения полей Dictionary <,>, но у меня сложилось впечатление, что работать бесперебойно.