Unity3D中门打开后无法完全关闭的问题求助
问题排查:Unity门无法完全关闭
在Unity中制作测试门时,发现门打开后无法完全关闭。已确认关门动画设置正确,且将门悬空排除了碰撞阻碍,核心代码如下:
// 注意:原代码第一块逻辑缺少触发条件,需确认实际触发逻辑 { unlockedSound.Play(); locked = false; keyOB.SetActive(false); StartCoroutine(unlockDoor()); } if (inReach && doorisClosed && unlocked && Input.GetButtonDown("Interact")) { door.SetBool("Open", true); door.SetBool("Closed", false); openText.SetActive(false); openSound.Play(); doorisOpen = true; doorisClosed = false; } else if (inReach && doorisOpen && unlocked && Input.GetButtonDown("Interact")) { door.SetBool("Open", false); door.SetBool("Closed", true); closeText.SetActive(false); closeSound.Play(); doorisOpen = false; doorisClosed = true; } if (inReach && locked && Input.GetButtonDown("Interact")) { openText.SetActive(false); lockedText.SetActive(true); lockedSound.Play(); } IEnumerator unlockDoor() { yield return new WaitForSeconds(0.05f); { unlocked = true; lockOB.SetActive(false); } }
具体排查方向
简化Animator参数逻辑
不需要同时维护Open和Closed两个布尔参数,用单个IsOpen参数即可控制开关状态,避免参数冲突。检查Animator状态机的过渡条件:从"打开"到"关闭"的过渡是否仅依赖IsOpen=false,且未勾选Has Exit Time(避免动画未走完就中断)。同步代码变量与Animator状态
代码中同时维护doorisOpen/doorisClosed和Animator参数,容易出现不同步问题。建议直接读取Animator参数判断门的状态,去掉冗余变量:bool isDoorOpen = door.GetBool("Open"); if (inReach && !isDoorOpen && unlocked && Input.GetButtonDown("Interact")) { door.SetBool("Open", true); // 其他打开逻辑 } else if (inReach && isDoorOpen && unlocked && Input.GetButtonDown("Interact")) { door.SetBool("Open", false); // 其他关闭逻辑 }验证动画片段结尾状态
在Animator窗口手动播放关门动画,查看动画最后一帧门的Transform(位置/旋转)是否完全回到初始关闭状态。如果动画本身结尾未归位,播放完自然会有偏移。排查冗余逻辑与变量初始化
原代码第一块逻辑缺少触发条件(比如是否检测到钥匙),如果每帧都执行会意外修改locked/unlocked变量,导致状态混乱。另外,unlockDoor()协程的0.05秒延迟意义不大,可直接将unlocked=true放在解锁逻辑中,去掉协程测试。
内容的提问来源于stack exchange,提问作者cope
相关产品推荐
相关产品推荐

