כפור
שיעור 21 מתוך 25 בקורס משחק 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, הוסףpublic float slowFactor = 1f;ואתpublic float slowDuration;(עבור FrostData: 0.5 ו־2). - ב־
Enemy, המתודהpublic void Slow(float factor, float duration)שומרת את המקדם ואתslowUntil = Time.time + duration; נוע במהירותdata.speedכפול המקדם כל עודTime.time < slowUntil. - ב־
Projectile, אחרי גרימת הנזק, אםdata.slowDuration > 0ולמטרה יש רכיבEnemy, האט אותה.
לחץ על "שחק" עם מגדל Frost לפני החצים שלך: אויבי Grunt שקפאו הולכים בחצי מהמהירות. אחר כך לחץ על "בדיקה".
נסו בעצמכם
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);
}
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה משחק Unity: הגנת מגדלים
תרגלו בעצמכם: Unity אונליין