Menu
CoddyTech

Zasoby danych

Część sekcji Architektura gier w Unity ścieżki Unity w Coddy. Lekcja 23 z 64.

W grze o farmie rosną marchewki i dynie. Marchewka rośnie przez 30 sekund i sprzedaje się za 5 monet, a dynia rośnie przez 90 sekund i sprzedaje się za 40. Te liczby dotyczą uprawy, a nie pojedynczej rośliny: jeśli są polami Inspectora w skrypcie Plant, każda marchewka w każdej scenie ma własną kopię wartości 30 i 5, a ich zmiana wymaga znalezienia wszystkich tych kopii. ScriptableObject przechowuje takie dane w zasobie — pliku w projekcie, do którego może odwoływać się dowolna liczba obiektów. Jego klasa dziedziczy po ScriptableObject, a nie po MonoBehaviour:

using UnityEngine;

[CreateAssetMenu(fileName = "NewPlant", menuName = "Farm/Plant Data")]
public class PlantData : ScriptableObject
{
    public string plantName;
    public float growTime;
    public int sellPrice;
}

[CreateAssetMenu] dodaje klasę do menu Create w oknie Project. Kliknij prawym przyciskiem myszy w oknie Project, wybierz Create > Farm > Plant Data, a Unity utworzy zasób o nazwie NewPlant; zmień jego nazwę na Carrot, zaznacz go i wpisz Carrot, 30 i 5 w jego polach w Inspectorze. Zasób Pumpkin utworzysz w ten sam sposób. Klasa znajduje się w pliku o takiej samej nazwie jak ona — PlantData.cs — podobnie jak w przypadku MonoBehaviour.

Zachowanie pozostaje w MonoBehaviour, które ma pole typu tego zasobu. Przeciągnij zasób Carrot na to pole, a skrypt będzie odczytywać za jego pośrednictwem liczby:

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 nie znajduje się na żadnym obiekcie GameObject ani w żadnej scenie. Nie ma komponentu Transform, a Unity nigdy nie wywołuje jego Update ani Start: przechowuje dane, a Plant przechowuje zachowanie. Gdy 200 marchewek wskazuje jeden zasób Carrot, ustawienie jego growTime na 25 zmienia wartość dla wszystkich 200. W kodzie instancję tworzy się za pomocą ScriptableObject.CreateInstance<PlantData>(), nigdy za pomocą new.

challenge icon

Wyzwanie

Średni

Przenieś ustawienia bohatera do zasobu danych.

  1. W pliku HeroData.cs napisz public class HeroData : ScriptableObject z publicznymi polami string heroName, float moveSpeed i Color color.
  2. Umieść [CreateAssetMenu(menuName = "Heroes/Hero Data")] w wierszu nad nim.
  3. W pliku Hero.cs zastąp trzy pola przez public HeroData data; i używaj zamiast nich data.heroName, data.moveSpeed i data.color.

Naciśnij „Graj”: czerwony Rycerz porusza się z prędkością 3. Następnie naciśnij „Sprawdź”.

Spróbuj swoich sił

using UnityEngine;

// HeroData: imię, szybkość i kolor bohatera w postaci ScriptableObject

Wszystkie lekcje w sekcji Architektura gier w Unity

Poćwicz samodzielnie: Edytor online Unity