冰冻
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 会让这种类型的所有敌人都减速,包括尚未生成的敌人,而且速度永远不会恢复。第二片碎片击中已减速的敌人时,会再次设置减速系数和结束时间,所以只要冰霜塔持续命中,减速效果就会持续,但不会变得更强。
挑战
中等冰霜碎片会让敌人减速一段时间。
- 在
TowerData中,添加public float slowFactor = 1f;和public float slowDuration;(FrostData:0.5 和 2)。 - 在
Enemy中,public void Slow(float factor, float duration)会保存减速系数,并设置slowUntil = Time.time + duration;当Time.time < slowUntil时,以data.speed乘以减速系数的速度移动。 - 在
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);
}
}
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
Unity 塔防游戏中的所有课
自己练习: Unity 在线编辑器