База по ScriptableObject в Unity

База по ScriptableObject в Unity

Введение

ScriptableObject — это специальный тип объекта в Unity, предназначенный для хранения данных вне сцены и игровых объектов. В отличие от MonoBehaviour, он не требует размещения на GameObject и может быть сохранён в виде отдельного файла. Это делает его отличным инструментом для повторного использования и организации данных в проекте

Если говорить проще — то это контейнер для данных, который живёт сам по себе и не зависит от сцены или объекта.

Когда и зачем это использовать

ScriptableObject особенно полезен когда:

  • Нужно вынести параметры объектов (оружие, враги, умения)

  • Требуется централизованная база данных (предметы, диалоги)

  • Вы реализуете архитектуру событий (например, через Event Channel)

  • Вы хотите перейти на data-driven подход, где поведение задаётся через данные, а не жёсткий код

Пример:

В каком-то проекте параметры оружия хранились прямо в префабе. После перехода на ScriptableObject стало проще управлять балансом и переиспользовать эти данные в других системах.

Как создать ScriptableObj

  • Создайте C#-класс, унаследованный от ScriptableObject:

[CreateAssetMenu(fileName = "NewWeapon", menuName = "Weapons/WeaponData")] public class WeaponData : ScriptableObject { public string weaponName; public int damage; public float cooldown; }
  • После этого создайте экземпляр в Unity: Assets → Create → Weapons → WeaponData

Архитектурный подход

ScriptableObject отлично сочетается с модульной и data-driven архитектурой. Он позволяет разделить данные и поведение, облегчая масштабирование и поддержку проекта.

Используется в:

  • Системах навыков (каждый навык — отдельный ScriptableObject)

  • Конфигурации уровней и параметров сцен

  • UI-элементах (например, карточках с параметрами)

  • Системах модификаторов (бафы, дебаффы, эффекты)

На что обращать внимание

  • Изменения, сделанные в ScriptableObject во время игры в редакторе, сохраняются — аккуратнее с этим

  • Не стоит использовать ScriptableObject для временных данных, например, текущего прогресса игрока

  • Unity не сериализует словари(Dictionary) и некоторые вложенные структуры — можно использовать SerializableDictionary из сторонних решений

  • Если нужен уникальный экземпляр во время игры, используйте Instantiate:

var instance = ScriptableObject.Instantiate(originalData);

Полезные ссылки

  • https://docs.unity3d.com/ScriptReference/ScriptableObject.html
  • https://www.youtube.com/watch?v=raQ3iHhE_Kk
  • https://www.youtube.com/watch?v=6vmRwLYWNRo

"Никогда не использую по несколько раз разные видосики для моих фанатов, я просто краду их"

Вика Похотливая

Заключение

ScriptableObject — это один из мощных инструментов в Unity, который часто недооценивают. Он делает проект чище, гибче и легче в поддержке. Если вы уже используете сериализуемые классы и копируете данные в скрипты — попробуйте перенести их в ScriptableObject. Надеюсь, материал был полезен

1
Начать дискуссию