Menu
CoddyTech

冰冻

Coddy Unity 塔防游戏 课程的第 21 课,共 25 课。

冰霜塔造成的伤害很低,但它的碎片会让敌人减速一段时间。减速是一种敌人状态,并且会在某个时刻结束:敌人会保存减速系数和减速结束时间,并在每一帧根据其资源中的速度计算自己的速度。在 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;当 Time.time < slowUntil 时,以 data.speed 乘以减速系数的速度移动。
  3. 在 Projectile 中,造成伤害后,如果 data.slowDuration > 0 且目标是一个 Enemy,就让它减速。

在箭矢塔之前放置一座冰霜塔,然后按“开始”:受到冰霜效果的 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 在线编辑器