כוונון
שיעור 8 מתוך 18 בקורס משחק Unity: הגנת מגדלים של Coddy.
מגדל פונה לעבר המטרה שלו: לא המגדל כולו, שעומד על המשטח שלו, אלא הראש שלו, אובייקט-בן שנושא את הקנה. סיבוב של אובייקט-בן מסובב את כל מה שמתחתיו ומשאיר את אובייקט-האב כפי שהוא.
האויבים הולכים נמוך יותר מהראשים, ולכן הכיוון מראש אל האויב פונה מעט כלפי מטה, וראש שהיה פונה ישר לאורכו היה נוטה קדימה. הגדרת y של הכיוון ל-0 משאירה אותו אופקי, כך שהראש מסתובב רק סביב הציר האנכי. מנורת מגדלור שעוקבת אחרי ספינה:
Vector3 toShip = ship.position - lamp.position;
toShip.y = 0f;
lamp.rotation = Quaternion.LookRotation(toShip);Quaternion.LookRotation(direction) היא הסיבוב שפונה לכיוון הזה, ולכן המנורה מסתובבת מיד לעבר הספינה. ראש של מגדל צריך להסתובב במהירות מסוימת במקום זאת: Quaternion.RotateTowards(from, to, maxDegrees) מפרק הסיבוב מסובבת לכל היותר ב-maxDegrees, ומהירות סיבוב במעלות לשנייה כפול Time.deltaTime נותנת את החלק של כל פריים.אתגר
בינוני- ב־
Tower, הוסף שני שדות מסודרים:head(מסוג Transform) ו־turnSpeed(מספר ממשי, מעלות לשנייה). ה־prefab של ArrowTower מספק את צאצא ה־ArrowHead שלו ואת הערך 270. - כל עוד יש למגדל מטרה, סובב את הראש לכיוונה, סביב הציר האנכי בלבד, בקצב של עד
turnSpeedמעלות לשנייה. - כשאין מטרה, השאר את הראש כפי שהוא.
לחץ על Play, בנה מגדלים לצד השביל וצפה בהם עוקבים אחר האויבים, ואז לחץ על Check.
נסו בעצמכם
using UnityEngine;
public class Tower : MonoBehaviour
{
public int cost = 50;
public float range = 4f;
private Enemy target;
void Update()
{
target = FindTarget();
}
Enemy FindTarget()
{
Enemy nearest = null;
float nearestDistance = range;
foreach (Enemy enemy in Enemy.All)
{
float distance = Vector3.Distance(transform.position, enemy.transform.position);
if (distance <= nearestDistance)
{
nearest = enemy;
nearestDistance = distance;
}
}
return nearest;
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.