נתוני אויבים
שיעור 2 מתוך 18 בקורס משחק Unity: הגנת מגדלים של Coddy.
במשחק הגנת מגדלים יש סוגים שונים של אויבים: חיילים פשוטים, רצים מהירים וטנקים איטיים. כל חייל פשוט הולך באותה מהירות ומתחיל עם אותו מספר נקודות בריאות, לכן המספרים האלה שייכים לסוג, ולא לאויב יחיד. הם נמצאים בנכס ScriptableObject, אחד לכל סוג, וכל אויב מאותו סוג מצביע אליו. משנים את הנכס, וכל אויב מאותו סוג משתנה יחד איתו.
נכס לא אמור להכיל את המצב של אויב יחיד. לחייל פשוט שחטף פגיעה יש פחות נקודות בריאות מאשר לחייל הפשוט שמאחוריו, ולכן הנכס מכיל את maxHealth, מספר נקודות הבריאות שאיתו חייל פשוט מתחיל, וכל אויב מעתיק אותו לשדה משלו. משחק מרוצים מפצל מכונית באותה דרך:
[CreateAssetMenu(fileName = "NewCar", menuName = "Racing/Car Data")]
public class CarData : ScriptableObject
{
public float topSpeed = 30f;
public float tankSize = 50f;
}
public class Car : MonoBehaviour
{
public CarData data;
private float fuel;
void Awake()
{
fuel = data.tankSize;
}
}כל המכוניות מאותו דגם חולקות CarData אחד, וכל אחת צורכת את ה-fuel שלה. כתיבה של data.tankSize -= used במקום זאת תרוקן את המכל של כל המכוניות מאותו דגם בבת אחת, ובעורך השינוי יישאר בנכס גם אחרי Play. Awake פועלת ברגע שהאובייקט נוצר, כך שההעתקה מוכנה לפני שמשהו יכול להשתמש בה.
אתגר
קלRunner מצטרף ל-Grunt: מהיר יותר, עם פחות בריאות. צרו לכל סוג נכס משלו.
- ב-
EnemyData.cs, הגדירו את EnemyData כך שאפשר יהיה ליצור אותו מתפריט Create עם שם התפריטTower Defense/Enemy Data, והוסיפו לו את השדות הציבורייםspeed(מסוג float),maxHealthו-reward(מסוג int). - ב-
Enemy.cs, החליפו את השדהspeedבשדה ציבוריdataמסוג EnemyData, והגדירו את התנועה לפיdata.speed. - הוסיפו int פרטי בשם
health, והגדירו אותו לערךmaxHealthשל הנכס בתוךAwake.
בפרויקט יש נכס GruntData (מהירות 2, בריאות 9, פרס 5) ונכס RunnerData (מהירות 3.5, בריאות 5, פרס 3), וב-Inspector מוקצה לכל אויב נכס משלו. לחצו על Play וצפו ב-Runner עוקף את Grunt, ואז לחצו על Check.
נסו בעצמכם
using UnityEngine;
// יופיע בהמשך: הנתונים הסטטיסטיים של סוג אחד של אויב, בתור asset.
public class EnemyData : ScriptableObject
{
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.