Unity中玩家执行开门动画后无法回到Idle动画问题求助
解决Unity玩家开门动画后无法回到Idle的问题
一、先调玩家Animator状态机(关键!)
新手容易在状态机过渡上踩坑,别用触发器来回切Idle,按下面的步骤设置:
- 把
Idle设成默认状态(右键Idle选「Set as Layer Default State」,让橙色箭头指向它) - 从
Idle到OpenDoor的过渡:- 条件选
Trigger: OpenDoor - 取消
Has Exit Time,勾选Fixed Duration(保持0.2就行)
- 条件选
- 从
OpenDoor回到Idle的过渡:- 别用触发器!直接开启
Has Exit Time,把Exit Time设成1(意思是动画播完最后一帧自动触发过渡) - 取消
Fixed Duration,让过渡跟着动画自然结束走
- 别用触发器!直接开启
- 最后检查
OpenDoor动画剪辑:在Inspector里取消Loop Time,防止动画无限循环
二、优化DoorController脚本
加个「玩家在触发范围内才允许开门」的逻辑,避免误触,同时保证动画触发逻辑没问题:
using UnityEngine; public class DoorController : MonoBehaviour { public Animator doorAnimator; public Animator playerAnimator; private bool isPlayerNearDoor = false; private void OnTriggerEnter(Collider other) { if (other.CompareTag("Player")) { isPlayerNearDoor = true; Debug.Log("玩家走到门旁边了"); } } private void OnTriggerExit(Collider other) { if (other.CompareTag("Player")) { isPlayerNearDoor = false; Debug.Log("玩家离门远了"); } } private void Update() { // 只有玩家在门附近,且动画器正常时,才响应E键 if (Input.GetKeyDown(KeyCode.E) && isPlayerNearDoor && doorAnimator != null && doorAnimator.isActiveAndEnabled) { doorAnimator.SetTrigger("OpenDoor"); if (playerAnimator != null && playerAnimator.isActiveAndEnabled) { playerAnimator.SetTrigger("OpenDoor"); } } } }
三、排查小问题
- 如果还是卡在开门动画第一帧:检查
OpenDoor动画的Wrap Mode是不是设成了Once(在动画剪辑的Inspector里,Wrap Mode选Once,动画播完会停在最后一帧,不会跳回第一帧) - 如果动画闪烁:检查过渡的
Duration是不是设得太小,或者有没有重复触发OpenDoor触发器(比如玩家多次按E,导致状态来回切换)
内容的提问来源于stack exchange,提问作者PRVSNL
相关产品推荐
相关产品推荐

