Ресурсы данных
Часть раздела Архитектура игр в Unity путешествия по Unity на Coddy. Урок 23 из 64.
В фермерской игре растут морковь и тыквы. Морковь растёт 30 секунд и продаётся за 5 монет, а тыква растёт 90 секунд и продаётся за 40. Эти числа относятся к культуре, а не к отдельному растению: если хранить их в полях Inspector скрипта Plant, у каждой моркови на каждой сцене будет своя копия значений 30 и 5, и при изменении придётся найти их все. ScriptableObject хранит такие данные в ресурсе — файле в проекте, на который могут ссылаться любые объекты. Его класс наследуется от ScriptableObject, а не от MonoBehaviour:
using UnityEngine;
[CreateAssetMenu(fileName = "NewPlant", menuName = "Farm/Plant Data")]
public class PlantData : ScriptableObject
{
public string plantName;
public float growTime;
public int sellPrice;
}[CreateAssetMenu] добавляет класс в меню Create окна Project. Щёлкни правой кнопкой мыши в окне Project, выбери Create > Farm > Plant Data, и Unity создаст ресурс с именем NewPlant; переименуй его в Carrot, выбери его и введи Carrot, 30 и 5 в соответствующие поля Inspector. Ресурс Pumpkin создаётся таким же образом. Класс помещается в файл с таким же именем — PlantData.cs, как и MonoBehaviour.
Поведение остаётся в MonoBehaviour, в котором есть поле типа ресурса. Перетащи ресурс Carrot в это поле, и скрипт сможет считывать через него числа:
public class Plant : MonoBehaviour
{
public PlantData data;
private float age;
void Update()
{
age += Time.deltaTime;
if (age >= data.growTime)
{
Debug.Log(data.plantName + " is ready, worth " + data.sellPrice);
enabled = false;
}
}
}ScriptableObject не находится ни на одном GameObject и ни в одной сцене. У него нет Transform, и Unity никогда не вызывает его Update или Start: он хранит данные, а Plant отвечает за поведение. Если 200 морковей ссылаются на один ресурс Carrot, изменение growTime на 25 повлияет на все 200. В коде экземпляр создаётся с помощью ScriptableObject.CreateInstance<PlantData>(), но никогда — с помощью new.
Задание
СреднеПеренеси настройки героя в ресурс данных.
- В
HeroData.csнапишиpublic class HeroData : ScriptableObjectс открытыми полямиstring heroName,float moveSpeedиColor color. - Помести
[CreateAssetMenu(menuName = "Heroes/Hero Data")]строкой выше. - В
Hero.csзамени три поля наpublic HeroData data;и вместо них обращайся кdata.heroName,data.moveSpeedиdata.color.
Нажми «Играть»: красный Рыцарь ходит со скоростью 3. Затем нажми «Проверить».
Попробуйте сами
using UnityEngine;
// HeroData: имя, скорость и цвет героя в виде ScriptableObject
Все уроки раздела Архитектура игр в Unity
1Компоненты, а не иерархии
Небольшие компонентыБазовый скрипт врагаАбстрактные компонентыКомпоненты работают вместеПовторение: модульная турельПовторение: спаренная пушка4Сериализованные данные
Сериализуемые классыСписки в инспектореПеречисления в инспектореПовторение: таблица добычиПовторение: определяем добычу2Интерфейсы в Unity
IDamageableИнтерфейсы и TryGetComponentGetComponentsПовторение: клавиша взаимодействияПовторение: ближайший в пределах досягаемости5ScriptableObjects
Ресурсы данныхХарактеристики оружияОбщие настройкиСохраняем ветерВолны как данныеПовторение: база предметовПовторение: покупка в магазинеПотренируйтесь самостоятельно: Песочница Unity