נקודות ציון
שיעור 1 מתוך 18 בקורס משחק Unity: הגנת מגדלים של Coddy.
בקורס הזה תבנה משחק הגנת מגדלים. אויבים צועדים לאורך מסלול בגלים לעבר הבסיס שלך, ואתה עוצר אותם באמצעות מגדלים שאתה מציב על משטחי בנייה, ואז משדרג ומוכר. בכל שיעור מתווספת תכונה אחת. כל שנים עשר הסקריפטים של המשחק נמצאים בפרויקט מההתחלה; רובם שלדים קצרים ששיעורים מאוחרים יותר משלימים.
אויב עוקב אחר המסלול דרך נקודות ציון: אובייקטים ריקים מסוג GameObject בפינות, במערך לפי סדר המעבר ביניהן. האויב שומר את האינדקס של נקודת הציון שאליה הוא מתקדם, נע לעברה, וכשמגיע אליה ממשיך לנקודה הבאה. Vector3.MoveTowards(current, target, maxStep) מזיז נקודה לעבר יעד במרחק של לכל היותר maxStep, ולעולם לא מעבר לו, כך שהאויב מגיע בדיוק לנקודת הציון ו-== יכול לזהות שהוא הגיע. רחפן הסיור הזה טס בין העמדות שלו ומתחיל מחדש אחרי האחרונה:
public Transform[] posts;
public float speed = 3f;
private int current;
void Update()
{
Vector3 goal = posts[current].position;
transform.position = Vector3.MoveTowards(transform.position, goal, speed * Time.deltaTime);
if (transform.position == goal)
{
current = (current + 1) % posts.Length;
}
}אויב אינו נע בלולאה: אחרי נקודת הציון האחרונה אין לו לאן להמשיך. כשהאינדקס מגיע ל-Length, הוא כבר לא מצביע על נקודת ציון, וקריאה אל waypoints[waypoints.Length] זורקת חריגה מסוג IndexOutOfRangeException, לכן בודקים את האינדקס לפני השימוש בו. נקודות הציון ממוקמות 0.6 מעל הקרקע, בגובה מרכזו של האויב, כך שההליכה הישרה לעברן משאירה את רגליו על הקרקע.
אתגר
קלה-Grunt עומד בנקודת הציון הראשונה, WP0, ולסקריפט Enemy שלו כבר יש את שמונה נקודות הציון בתוך waypoints, מ-WP0 בנקודת ההופעה ועד WP7 בבסיס.
- הוסף int פרטי בשם
next: האינדקס של נקודת הציון שאליה ה-Grunt מתקדם. הוא מתחיל ב-WP0, לכןnextמתחיל ב-1. - ב-
Update, הזז את ה-Grunt לכיווןwaypoints[next]במהירות שלspeedיחידות לשנייה באמצעותVector3.MoveTowards. - כשהוא מגיע לנקודת הציון הזאת, התקדם לנקודת הציון הבאה.
- אחרי נקודת הציון האחרונה, עצור: בלי תנועה נוספת ובלי שגיאות.
לחץ על Play וצפה ב-Grunt צועד לאורך המסלול, ואז לחץ על Check.
נסו בעצמכם
using UnityEngine;
public class Enemy : MonoBehaviour
{
public float speed = 2f;
public Transform[] waypoints;
void Update()
{
// יש לנוע כאן לאורך המסלול: מנקודת ציון לנקודת ציון, לפי הסדר.
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.