Unity跑酷游戏电梯平台While循环致崩溃问题求助
问题分析与修复方案
崩溃核心原因
你的Wait协程内的while循环没有帧延迟(无yield语句),会在单帧内无限执行,直接卡死Unity主线程导致崩溃。同时Update里每次满足条件就启动新协程,会同时运行大量重复协程,进一步加重问题。
修复步骤与代码调整
1. 修复协程死循环
在while循环内添加yield return null,让移动逻辑每帧执行一次,避免阻塞主线程:
// 新增标志位,防止重复启动协程 private bool isMoving; IEnumerator Wait() { yield return new WaitForSeconds(secondsToWait); isMoving = true; while (canGoUp && isDown && !isUp) { Debug.Log("entered"); // 电梯沿Y轴上升,替换原Vector3.forward为Vector3.up transform.Translate(Vector3.up * speed * Time.deltaTime); // 每帧执行一次,避免死循环 yield return null; } isMoving = false; Debug.Log("Left"); }
2. 修正位置判断逻辑
你的位置判断条件写反了:downPos是电梯底部(y值更小的负数),upPos是顶部(y值更大的负数),调整判断逻辑如下:
void Update() { // 到达底部时标记状态 if (transform.position.y <= downPos) { isDown = true; isUp = false; } // 到达顶部时标记状态并重置触发条件 else if (transform.position.y >= upPos) { isUp = true; isDown = false; canGoUp = false; } // 仅在非移动状态、满足触发条件时启动协程 if (canGoUp && isDown && !isUp && !isMoving) { StartCoroutine(Wait()); } }
3. 优化触发器逻辑
添加标签判断,确保仅响应玩家触发,避免误触发:
void OnTriggerEnter(Collider other) { if (other.CompareTag("Player")) { canGoUp = true; } }
额外说明
- 移动时乘以
Time.deltaTime,让移动速度不受帧率波动影响。 - 把
Vector3.forward改为Vector3.up,符合垂直电梯的上升逻辑。 isMoving标志位彻底避免了重复启动协程的问题。
内容的提问来源于stack exchange,提问作者Crucial Beauty
相关产品推荐
相关产品推荐

