ירי
שיעור 9 מתוך 18 בקורס משחק Unity: הגנת מגדלים של Coddy.
מגדל יורה לעבר המטרה שלו fireRate פעמים בשנייה. במקום להשתמש בטיימר שסופר לאחור, המגדל שומר את הזמן של הירייה הבאה שלו: כשהזמן ב־Time.time מגיע אליו, המגדל יורה ומקדם אותו ב־1f / fireRate שניות. ממטרה שמתיזה מים פעמיים בשנייה:
if (Time.time >= nextSpray)
{
Spray();
nextSpray = Time.time + 1f / spraysPerSecond;
}כל ירייה היא Projectile שעף אל המטרה שלו באמצעות MoveTowards, עוקב אחריה כשהיא הולכת ופוגע בה כשהוא מגיע. הוא לא צריך לדעת שהוא פגע ב־Enemy: הוא מבקש מהמטרה את IDamageable, הממשק של כל דבר שיכול לספוג נזק, כפי שמוסבר בפרק הממשקים, כך שאפשר לירות בכל דבר שמממש אותו.
מטרה יכולה למות בזמן שירייה נמצאת באוויר, בעקבות ירייה של מגדל אחר. לאחר מכן, target של הירייה שווה ל־null, כפי שקורה לכל אובייקט Unity שהושמד, ולירייה כבר אין לאן לעוף, ולכן היא משמידה את עצמה.
אתגר
בינוניIDamageableמצהיר עלvoid TakeDamage(int amount). יש לממש אותו ב-Enemy: הכמות מופחתת מהבריאות שלו, וברגע שהיא 0 או פחות, האויב מושמד.- ב-
Projectile, הוסיפו משתנהspeedמסוג float עם מאפיין serialized (ה-Prefab מגדיר אותו ל-12), ואתpublic void Launch(Transform target, int damage), ששומר את שניהם. ב-Update, עופו לכיוון המטרה במהירותspeed; עם ההגעה, קראו ל-TakeDamage(damage)במימוש של IDamageable שלה והשמידו את הקליע. אם המטרה נעלמה, השמידו את הקליע. - ב-
Tower, הוסיפו int ציבורי בשםdamage, float ציבורי בשםfireRate(יריות לשנייה) ו-projectilePrefabעם מאפיין serialized (מסוג Projectile). כל עוד יש למגדל מטרה, ירו לכל היותרfireRateפעמים בשנייה: צרו מופע של הקליע מעט לפני הראש, במיקוםhead.position + head.forward * 0.6f, ושגרו אותו אל המטרה עם הנזק של המגדל.
ה-Prefab של ArrowTower מגדיר נזק של 2 ו-fireRate של 1.5, והקליע שלו הוא ArrowShot. לחצו על Play, בנו מגדלים ועצרו את הגל הראשון, ואז לחצו על Check.
נסו בעצמכם
using UnityEngine;
// בהמשך: ירייה שעפה ממגדל אל המטרה שלה.
public class Projectile : MonoBehaviour
{
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.