נכסי נתונים
חלק מהיחידה ארכיטקטורת משחקים ב-Unity במסלול ה-Unity של Coddy. שיעור 19 מתוך 50.
במשחק חווה מגדלים גזרים ודלעות. גזר גדל במשך 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.
אתגר
בינוניהגיבור נע בזירה באמצעות החצים. השם, המהירות והצבע שלו הם שדות בסקריפט Hero, וכל גיבור חדש יצטרך להעתיק אותם שוב. העבירו אותם לנכס:
- ב־
HeroData.cs, כתבו אתHeroData, אובייקט ScriptableObject עם השדות הציבורייםheroName(מחרוזת),moveSpeed(מספר מסוג float) ו־color(מסוג Color). הוסיפו לו את[CreateAssetMenu]עם שם התפריטHeroes/Hero Data. - ב־
Hero.cs, החליפו את שלושת השדות בשדה ציבורי אחד בשםdataמסוג HeroData, והשתמשו בערכי הנכס במקומות שבהם הסקריפט השתמש בערכים שלו עצמו.
בפרויקט יש נכס Knight שנוצר באמצעות התפריט הזה (Knight, מהירות 3, אדום), וה־Inspector משייך אותו לשדה data של הגיבור. לחצו על Play והניעו את Knight ברחבי הזירה, ואז לחצו על Check.
נסו בעצמכם
using UnityEngine;
// HeroData: השם, המהירות והצבע של הגיבור, בתור ScriptableObject
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה ארכיטקטורת משחקים ב-Unity
1רכיבים, לא היררכיות
רכיבים קטניםסקריפט בסיס לאויברכיבים מופשטיםרכיבים שעובדים יחדסיכום: צריח מודולרי