Unity FPS项目:如何强制未播放完成的Hitmarker动画重播?
解决Unity中Hitmarker动画无法连续触发的问题
针对你用Animation组件实现Hitmarker时,快速连续命中无法重新触发动画的问题,有几种直接的解决方法:
方法1:使用Animation.Play的重载强制重启动画
Animation.Play()默认不会中断正在播放的同名称动画,你可以使用带PlayMode参数的重载,强制停止同层动画并重新播放:
修改你Shoot方法中的动画调用代码:
if (targetBody != null) { targetBody.TakeDamageBody(damageBody); hitMarkerBodySound.Play(1); // 用StopSameLayer强制中断同层动画并从头播放 anim.Play("HitMarkerBodyAnim", PlayMode.StopSameLayer); }
PlayMode.StopSameLayer会停止当前动画所在层的所有动画,然后立即启动新的动画,这样每次命中都会从头播放Hitmarker动画。
方法2:手动重置动画时间再播放
如果需要更精细的控制,可以先停止动画、重置播放时间,再重新启动:
if (targetBody != null) { targetBody.TakeDamageBody(damageBody); hitMarkerBodySound.Play(1); // 停止目标动画 anim.Stop("HitMarkerBodyAnim"); // 将动画时间重置为0帧 anim["HitMarkerBodyAnim"].time = 0; // 重新播放 anim.Play("HitMarkerBodyAnim"); }
推荐方案:改用Animator组件(更现代的动画系统)
如果你项目允许,建议替换成Animator组件(Unity推荐的现代动画系统),它的Play方法支持直接指定从开头播放,无需额外处理:
- 将CanvasCrosshair上的Animation组件替换为Animator组件
- 创建Animator Controller,添加HitmarkerBodyAnim动画状态
- 修改脚本中的代码:
// 替换原来的Animation变量为Animator public Animator anim; void Start() { anim = CanvasCrosshair.GetComponent<Animator>(); } // 在Shoot方法中调用 anim.Play("HitMarkerBodyAnim", -1, 0f);
第三个参数0f表示normalizedTime,强制动画从0%进度开始播放,不管当前是否在播放状态。
补充说明:优化Coroutine方案
你之前尝试的Coroutine方法也可以调整,确保每次命中都能重新触发显示:
private Coroutine activeHitMarkerCoroutine; if (targetBody != null) { targetBody.TakeDamageBody(damageBody); hitMarkerBodySound.Play(1); // 停止之前的协程(如果存在) if (activeHitMarkerCoroutine != null) StopCoroutine(activeHitMarkerCoroutine); hitMarkerBody.SetActive(true); activeHitMarkerCoroutine = StartCoroutine(HitMarkerBodyShow()); } IEnumerator HitMarkerBodyShow() { yield return new WaitForSeconds(showtime); hitMarkerBody.SetActive(false); activeHitMarkerCoroutine = null; }
内容的提问来源于stack exchange,提问作者Charles Marchand
相关产品推荐
相关产品推荐

