Unity 2D如何实现玩家死亡动画播放完毕后再显示游戏结束界面
Unity 2D死亡动画播放完毕后显示游戏结束界面的实现方案
Unity原生完全支持该需求,同时也有多种替代方案可以实现对应效果,具体实现方法如下:
原生内置功能实现
方法1:Animation事件(最推荐)
这是Unity官方提供的原生动画回调功能,实现成本最低、稳定性最高:
- 选中玩家对象,打开
Animation窗口,找到对应的死亡动画剪辑 - 将时间轴拖动到死亡动画的最后一帧,点击时间轴上方的「添加事件」按钮
- 在事件的Inspector面板中,将触发函数绑定到玩家脚本内的UI显示方法即可
配套代码示例:
using UnityEngine; using System.Collections; public class PlayerHealth : MonoBehaviour { // 提前在Inspector中赋值游戏结束UI对象 public GameObject gameOverUI; private Animator playerAnimator; private bool isDead = false; void Start() { playerAnimator = GetComponent<Animator>(); } // 玩家生命值归0时调用该方法触发死亡流程 public void TriggerDeath() { if(isDead) return; isDead = true; // 禁用玩家移动、碰撞等存活逻辑 GetComponent<PlayerMovement>().enabled = false; GetComponent<Collider2D>().enabled = false; // 触发死亡动画 playerAnimator.SetTrigger("isDead"); } // 绑定到死亡动画最后一帧事件的回调方法 public void ShowGameOverInterface() { gameOverUI.SetActive(true); } }
方法2:监听Animator状态播放进度
通过代码检测死亡动画的播放进度,动画播放完成后触发UI显示,可通过协程实现异步等待,不会阻塞主线程:
// 接上面的TriggerDeath方法修改 public void TriggerDeath() { if(isDead) return; isDead = true; GetComponent<PlayerMovement>().enabled = false; GetComponent<Collider2D>().enabled = false; playerAnimator.SetTrigger("isDead"); StartCoroutine(WaitForDeathAnimationFinish()); } IEnumerator WaitForDeathAnimationFinish() { // 等待1帧确保Animator完成状态切换 yield return null; // 循环等待死亡动画播放完成(normalizedTime >=1 代表播放完毕) while(playerAnimator.GetCurrentAnimatorStateInfo(0).normalizedTime < 1f) { yield return null; } gameOverUI.SetActive(true); }
其他替代实现方案
如果没有用Unity原生Animator系统做死亡动画,还可以用以下方案实现:
- 补间动画回调:如果是用DOTween、LeanTween等补间库制作的死亡动画,直接在补间逻辑后追加
OnComplete回调绑定UI显示方法即可 - 固定时长等待:如果明确知道死亡动画的总时长,可通过协程
yield return new WaitForSeconds(动画时长)的方式等待后显示UI,该方案仅适合临时测试用,动画时长修改后需要同步修改代码,维护成本较高
注意事项
- 使用Animator状态监听时,
GetCurrentAnimatorStateInfo的入参是动画层级索引,如果你没有修改过层级默认填0即可,如果死亡动画放在其他层级需要修改为对应层级的索引 - 死亡动画的状态需要关闭Loop循环,否则动画会一直重复,永远无法触发播放完成逻辑
- 要提前做好死亡逻辑的锁(比如上面代码的isDead标记),避免死亡逻辑被重复触发
内容的提问来源于stack exchange,提问作者BLACK GOKU
相关产品推荐
相关产品推荐

