前言
本节主要实现配置僵尸动画,移动,断头,攻击,死亡功能。
僵尸
配置僵尸动画
普通动画
无头动画,新增覆盖图层
需要注意的是,僵尸死亡记得去掉过度自动的勾选,不然死亡动画会一直重复播放
移动
新增Zombie
public class Zombie : MonoBehaviour { public Vector3 direction; //移动方向 public float speed;//速度 void Update() { transform.position += direction * speed * Time.deltaTime; } }
效果
断头
新增断头动画,配置预制体
修改Zombie,比如我们希望僵尸50血开始断头
private Animator animator; private Character character; public GameObject lostHead;//断头预制体 private Transform head;//断头位置 private bool isLostHead;//是否已经断头 private void Start() { animator = GetComponent<Animator>(); character = GetComponent<Character>(); head = transform.Find("Head"); currentSpeed = speed; } void Update() { //移动 transform.position += direction * currentSpeed * Time.deltaTime; //断头 if (character.currentHealth <= 50 && isLostHead == false) { isLostHead = true; Instantiate(lostHead, head.position, Quaternion.identity); animator.SetBool("headless", true); } }
配置
并在断头预制体新增脚本LostHead,一段时间后销毁
public class LostHead : MonoBehaviour { public float existenceTime = 3f;//存在时间 private void Start() { Destroy(gameObject, existenceTime); } }
效果
攻击
修改Zombie
//进入触发器 private void OnTriggerEnter2D(Collider2D other) { if (!other.CompareTag("Plant")) return; animator.SetBool("attack", true); currentSpeed = 0; } //离开触发器 private void OnTriggerExit2D(Collider2D other) { if (!other.CompareTag("Plant")) return; animator.SetBool("attack", false); currentSpeed = speed; }
记得修改僵尸刚体为永不休眠,不然可能
效果
死亡
植物和僵尸,甚至子弹其实都存在死亡,为了统一的进行管理,我们可以引用接口的定义
新增interface接口,定义OnDie死亡方法
public interface IInteractable { // 死亡 public void OnDie(); }
修改Character,调用对应接口的死亡方法
public void TakeDamage(Attack attacker) { if (invulnerable) return; if (currentHealth - attacker.damage > 0)// 如果扣除伤害后生命值大于0 { currentHealth -= attacker.damage;// 扣除伤害值 StartCoroutine(InvulnerableTimer()); // 启动无敌状态计时器 } else { currentHealth = 0; GetComponent<IInteractable>().OnDie(); } }
修改Zombie,关联IInteractable接口,定义僵尸的死亡方法
public class Zombie : MonoBehaviour, IInteractable { //。。。 public void OnDie() { currentSpeed = 0; animator.SetBool("die", true); GetComponent<Collider2D>().enabled = false; Destroy(gameObject, 2f); } }
同理,定义植物和子弹的死亡方法。记得同样关联IInteractable接口
public void OnDie() { Destroy(gameObject); }
僵尸死亡效果
植物死亡效果
源码
源码不出意外的话我会放在最后一节