Menu
CoddyTech

Ресурсы данных

Часть раздела Архитектура игр в 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.

challenge icon

Задание

Средне

Перенеси настройки героя в ресурс данных.

  1. В HeroData.cs напиши public class HeroData : ScriptableObject с открытыми полями string heroName, float moveSpeed и Color color.
  2. Помести [CreateAssetMenu(menuName = "Heroes/Hero Data")] строкой выше.
  3. В Hero.cs замени три поля на public HeroData data; и вместо них обращайся к data.heroName, data.moveSpeed и data.color.

Нажми «Играть»: красный Рыцарь ходит со скоростью 3. Затем нажми «Проверить».

Попробуйте сами

using UnityEngine;

// HeroData: имя, скорость и цвет героя в виде ScriptableObject

Все уроки раздела Архитектура игр в Unity

Потренируйтесь самостоятельно: Песочница Unity