Menu
CoddyTech

כפור

שיעור 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 יאט כל אויב מהסוג הזה, כולל אלה שעדיין לא נוצרו, ושום דבר לא יחזיר את המהירות לקדמותה. אם רסיס שני פוגע באויב מואט, הוא מגדיר שוב את המקדם ואת מועד הסיום, כך שההאטה נמשכת כל עוד מגדל הכפור ממשיך לפגוע, והיא אינה מתחזקת.

challenge icon

אתגר

בינוני

רסיסי כפור מאטים אויבים לזמן מה.

  1. ב־TowerData, הוסף public float slowFactor = 1f; ואת public float slowDuration; (עבור FrostData: ‏0.5 ו־2).
  2. ב־Enemy, המתודה public void Slow(float factor, float duration) שומרת את המקדם ואת slowUntil = Time.time + duration; נוע במהירות data.speed כפול המקדם כל עוד Time.time < slowUntil.
  3. ב־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);
        }
    }
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה משחק Unity: הגנת מגדלים

תרגלו בעצמכם: Unity אונליין