Як редагувати пари ключ-значення (наприклад, словник) в інспекторі Unity?


18

У мене є система написання, яку я створюю, принцип такий:

  • Кожне заклинання - це автономна збірка. Він містить сценарій з деякими властивостями (базові пошкодження, тривалість ...), які можна змінити в інспекторі.
  • У мене перелік заклинань перераховує всі можливі заклинання в коді, який використовується в логіці гри
  • Коли я хочу скласти заклинання, мені потрібно мати змогу отримати збірник цього заклинання, щоб інстанціювати його та читати його інформацію
  • Кожен актор (будь то гравці чи вороги) повинен мати список можливих анімацій для заклинань

Проблеми, які я намагаюся реалізувати, такі:

  • Для перерахування анімації кожного актора я міг би використовувати Dictionary<Spell, Animation>, але інспектор не підтримує словники, що ускладнює легко редагування кількох типів акторів.
  • Мені потрібен якийсь спосіб легко отримати доступ до заклинання з відповідного переліку. І тут я міг би використати словник, але я можу посилатися лише на збірки в інспекторі, а не на код, тобто я не зміг би заповнити цей словник

Я шукаю спосіб легко пов’язати мої переліки із заклинаннями з відповідними збірними та анімаціями


1
Чи можу я запропонувати змінити назву цього питання, щоб посилатися на отримання поведінки у словнику (відображення пар ключових значень) у інспектора Unity? Це допоможе полегшити пошук запитання для інших користувачів, які мають або шукають ідеї для вирішення подібної проблеми. Незважаючи на те, що в цьому конкретному випадку йдеться про заклинання, ті ж методи є більш широко застосовними.
DMGregory

@DM Я не знаю Єдності, але ваші загальні міркування здаються розумними. Будьте сміливі та редагуйте; відкати дешеві.
Анко

Відповіді:


24

Одним із швидких способів отримання пар ключових значень в інспектора Unity є визначення класу вхідного циклу, який можна серіалізувати, а потім використовувати масив або Список <> їх. наприклад ...

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 у ваше меню Create, наприклад: Скріншот екрана, що показує налаштоване меню "Створити" в Unity


Ви можете додатково зробити масив приватним і серіалізованим, щоб він все ще з'являвся в інспекторі, але додати публічний словник (або приватний словник із загальнодоступним методом GetAnimation (Spell spell)), щоб клієнти споживали для більш ефективних пошуку. У своєму методі OnEnable (), SpellAnimationMap може повторити через заселений інспектором масив, щоб створити цей словник один раз, знову поділивши перевагу між усіма клієнтськими екземплярами. (Зверніть увагу, що OnEnable () також викликається в редакторі під час першого створення ресурсу, тому переконайтеся, що ваш масив є недійсним, перш ніж спробувати його прочитати)

Нарешті, ви можете додати стільки даних у цей тип даних, скільки вам потрібно. Це може містити, наприклад, збірну інформацію, або будь-яку кількість інших бітів даних, які ви хочете пов’язати з ключем правопису.

Можна також написати спеціальні інспектори для заповнення полів Словник <,> безпосередньо, але я створюю враження, що це нерозумно плавно працювати.


Точно те, що мені довелося робити, чекаючи відповіді, тому я прийму цю
Мальхарк

0

Прочитайте пояснення, надані @DMGregory

Для тих, хто любить приклади:

public class SpellHandler : ScriptableObject
{
    public Spell[] keys;
    public Animation[] values;

    private Dictionary<Spell, Animation> dic;

    void Awake()
    {
        int length = keys.Length;
        this.dic= new Dictionary<Spell, Animation>(length);
        for (int i = 0; i < length; i++)
        {
            this.dic.Add(keys[i], values[i]);
        } 
    }    
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.