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.
Wyzwanie
ŚredniPrzenieś ustawienia bohatera do zasobu danych.
- W pliku
HeroData.csnapiszpublic class HeroData : ScriptableObjectz publicznymi polamistring heroName,float moveSpeediColor color. - Umieść
[CreateAssetMenu(menuName = "Heroes/Hero Data")]w wierszu nad nim. - W pliku
Hero.cszastąp trzy pola przezpublic HeroData data;i używaj zamiast nichdata.heroName,data.moveSpeedidata.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
1Komponenty, nie hierarchie
Małe komponentyBazowy skrypt przeciwnikaKomponenty abstrakcyjneWspółpracujące komponentyPowtórka: modułowa wieżyczkaPowtórka: podwójne działo4Dane serializowane
Klasy serializowalneListy w InspectorzeEnumy w InspectorzePodsumowanie: tabela łupówPodsumowanie: losowanie łupów2Interfejsy w Unity
IDamageableInterfejsy i TryGetComponentGetComponentsPowtórka: klawisz interakcjiPowtórka: najbliższy w zasięgu5ScriptableObjects
Zasoby danychStatystyki broniWspółdzielone ustawieniaOcal wiatrFale jako danePowtórka: Baza przedmiotówPowtórka: Kupowanie w sklepie8Kod wielokrotnego użytku
Metody rozszerzająceGeneryczny singletonGeneryczne metody pomocniczePodsumowanie: FindNearestPoćwicz samodzielnie: Edytor online Unity