Перейти к основному содержимому

Пример SerializeReferences

Турель, у которой оружие и его эффекты выбираются в инспекторе, и нарочно сломанные ассеты, чтобы их починить.

Манекен меняет цвет и уменьшается от урона настроенного оружия и эффектов.Манекен меняет цвет и уменьшается от урона настроенного оружия и эффектов.

Манекен меняет цвет и уменьшается от урона настроенного оружия и эффектов.

Как открыть​

  1. Импортируйте пример: Tools → Aspid 🐍 → FastTools → Welcome → Samples → Import у SerializeReferences.
  2. Откройте Scenes/SerializeReferences.unity и войдите в Play Mode: основное и запасное оружие по очереди бьют манекен, а каждый удар виден в Console.

Попробуйте​

Выйдите из Play Mode и выберите Loadout.

Оружие, вложенный эффект горения и модификаторы в инспекторе Loadout.Оружие, вложенный эффект горения и модификаторы в инспекторе Loadout.

Оружие, вложенный эффект горения и модификаторы в инспекторе Loadout.

  1. Выбор класса. Откройте список Primary: окно выбора с поиском перечисляет все конкретные IWeapon в группах Weapons/Melee и Weapons/Ranged из [TypeSelectorDisplay]. DebugWeapon скрыт через Hidden. Выберите Shotgun — его поля появятся под списком.
  2. Общие данные сохраняются. В Sidearms поставьте у Pistol Damage = 37, переключите его на Shotgun и обратно: Damage по-прежнему 37, потому что _damage объявлено в обоих классах.
  3. Списки. Нажмите + у Sidearms: вместо копии последнего элемента открывается окно выбора, и новый элемент получает собственный экземпляр. В Play Mode он встанет в очередь выстрелов.
  4. Сужение. Melee Backup объявлено как IWeapon, но [TypeSelector(typeof(IMelee))] предлагает только Sword. Поле Weapon в слотах Holster сужено так же, уровнем глубже, внутри обычного [Serializable]-класса: [TypeSelector(typeof(IRanged))] предлагает только дальнобойное оружие. В очередь выстрелов оба поля не входят.
  5. Вложенные ссылки. У Railgun в Primary есть Charge Effect — собственный [SerializeReference] со своим списком. В нём BurnEffect, поэтому от попадания рейлгана манекен загорается.
  6. Абстрактная база. On Hit — StatusEffect: окно выбора предлагает BurnEffect и FreezeEffect, но не абстрактный класс.
  7. Generics.
    • Damage Modifier — Modifier<float>: предлагаются DamageModifier и Modifier<Single>, оба создаются сразу.
    • Perks — List<IModifier>: кроме закрытых наследников предлагается открытый Modifier<T>, тип T выбирается на второй странице.
    • Урон меняет только DamageModifier; значения остальных выводит Loadout → Log Loadout в контекстном меню компонента.
  8. Обязательное поле. Поставьте Primary в <None>: под полем появится предупреждение. Сохраните сцену — Project References → Scan Project и CI с -srGateRequired покажут поле как нарушение; сборка плеера его не проверяет (что проверяет каждый запуск).
  9. Меню заголовка. Правый клик по заголовку поля — копирование и вставка, шаблоны, поиск использований и новый скрипт: все пункты.

Ремонт​

Ассеты в Presets/ и Prefabs/ хранят потерянные или устаревшие типы.

  1. Fix на одном ассете. Выберите Presets/BrokenWeaponPreset.asset: Weapon хранит несуществующий GhostWeapon, а уведомление Missing type под полем предлагает Fix. Нажмите его и выберите Pistol — Damage 25 и Magazine Size 8 сохранятся.
  2. Fix для группы. Откройте Tools → Aspid 🐍 → FastTools → Project References и нажмите Scan Project: три записи GhostWeapon из BrokenArsenalPreset.asset собраны в одну группу, и Fix all исправляет их разом.
  3. Подсказка класса. Presets/MovedWeaponPreset.asset хранит Pistol под старым пространством имён. Уведомление предлагает → Pistol, а группа в Project References — Smart Fix → Pistol; сами они не применяются.
  4. Миграция. Presets/RenamedWeaponPreset.asset хранит CrossbowLauncher, а класс теперь называется Crossbow и помечен [MovedFrom]: инспектор уже показывает Crossbow, устарел только файл. Migrate all → Crossbow в Project References записывает новое имя в файл.
  5. Префаб. Выберите Prefabs/BrokenLoadout.prefab в окне Project. Sidearms[2] — потерянный GhostCrossbow с Fix; Sidearms[0] и [1] указывают на один Pistol и помечены Shared reference #N, а Make unique даёт элементу собственную копию. Вкладка Asset References показывает все ссылки префаба.

Чтобы пройти ремонт заново, импортируйте пример повторно с перезаписью файлов.

IMGUI-инспектор​

У WeaponPreset инспектор на IMGUI — Scripts/Editor/WeaponPresetEditor.cs: поле и список рисуют обычные вызовы EditorGUILayout.PropertyField(), а окно выбора, Fix и + списка работают как в UI Toolkit. Поля без [TypeSelector] — в разделе Собственный инспектор.

Куда смотреть​

ФайлЧто показывает
Scripts/Loadout.csВсе формы поля: одиночное, список, суженное, контейнер, абстрактная база, закрытый и открытый generic, Required
Scripts/Weapons/Иерархия IWeapon, группы [TypeSelectorDisplay], скрытый через Hidden класс, [MovedFrom] на Crossbow, вложенная ссылка в Railgun
Scripts/Effects/, Scripts/Modifiers/Абстрактная база и открытый generic-класс
Scripts/WeaponPreset.cs, Presets/, Prefabs/Сценарии ремонта
Scripts/Editor/WeaponPresetEditor.csIMGUI-инспектор на обычных вызовах PropertyField

Справочник — SerializeReference Selector и SerializeReference Tooling.