You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 21:15:17