כפור
שיעור 15 מתוך 18 בקורס משחק Unity: הגנת מגדלים של Coddy.
מגדל הכפור בקושי גורם נזק, אבל הרסיסים שלו מאטים את האויב לזמן מה. האטה היא מצב של אויב אחד, ויש לה מועד סיום: האויב שומר את המקדם ואת הזמן שבו ההאטה מסתיימת, ומחשב את המהירות שלו בכל פריים לפי המהירות שבנתוני הנכס שלו. כל עוד Time.time לפני מועד הסיום, המקדם חל; לאחר מכן האויב חוזר למהירות מלאה ואין מה לבטל. מכונית מרוץ על משטח האצה:
public void Boost(float multiplier, float seconds)
{
boost = multiplier;
boostUntil = Time.time + seconds;
}float speed = data.topSpeed;
if (Time.time < boostUntil)
{
speed *= boost;
}אסור אף פעם לכתוב את ההאטה לתוך הנכס. data.speed *= 0.5f יאט כל אויב מהסוג הזה, כולל אלה שעדיין לא נוצרו, ושום דבר לא יחזיר את המהירות לקדמותה. אם רסיס שני פוגע באויב מואט, הוא מגדיר שוב את המקדם ואת מועד הסיום, כך שההאטה נמשכת כל עוד מגדל הכפור ממשיך לפגוע, והיא אינה מתחזקת.
אתגר
בינוני- ב־
TowerData, הוסף שדותfloatציבוריים בשםslowFactor(ברירת מחדל 1: ללא האטה) ו־slowDuration(ברירת מחדל 0). ב־FrostData קבע את הערכים 0.5 ו־2. - ב־
Enemy, הוסף אתpublic void Slow(float factor, float duration), ששומר את מקדם ההאטה ואת הזמן שבו ההאטה מסתיימת. בכל פריים האויב נע במהירות של הנכס שלו, כפול המקדם, כל עוד ההאטה נמשכת. - ב־
Projectile, אחרי גרימת הנזק, אם הערך שלslowDurationבנתונים גדול מ־0 ולמטרה יש רכיב Enemy, האט אותה באמצעות המקדם ומשך הזמן שבנתונים.
מגדל Frost נמצא בחנות, יחד עם הנכס FrostData שלו וקליע FrostShard. לחצו על הפעלה, הציבו מגדל Frost לפני החצים שלכם, ואז לחצו על בדיקה.
נסו בעצמכם
using System;
using System.Collections.Generic;
using UnityEngine;
public class Enemy : MonoBehaviour, IDamageable
{
public static readonly List<Enemy> All = new List<Enemy>();
public static event Action<Enemy> ReachedBase;
public static event Action<Enemy> Killed;
public EnemyData data;
public Transform[] waypoints;
private int next = 1;
private int health;
void Awake()
{
health = data.maxHealth;
}
void OnEnable()
{
All.Add(this);
}
void OnDisable()
{
All.Remove(this);
}
void Update()
{
Vector3 target = waypoints[next].position;
transform.position = Vector3.MoveTowards(transform.position, target, data.speed * Time.deltaTime);
if (transform.position == target)
{
next++;
if (next == waypoints.Length)
{
ReachedBase?.Invoke(this);
Destroy(gameObject);
}
}
}
public void TakeDamage(int amount)
{
if (health <= 0)
{
return;
}
health -= amount;
if (health <= 0)
{
Killed?.Invoke(this);
Destroy(gameObject);
}
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.