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 משנה את כולם. בקוד, יוצרים מופע בעזרת 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 אונליין