Unity中使用while循环导致引擎崩溃的原因咨询
Unity使用while循环实现持续移动导致引擎崩溃的原因及解决方法
崩溃原因
Unity主线程是单线程运行的,输入检测、渲染、物理更新、脚本逻辑全都在这条线程上按帧依次执行。你的代码里的while(i !=1)循环会直接阻塞主线程:
- 按下W键后
i被设为5,循环启动,会在当前帧内无限执行rb.AddForce,永远无法退出。 - 主线程被卡死之后,下一帧的代码(包括
Input.GetKeyUp的检测)根本没机会运行,i永远不会被重置为1,循环会持续占用CPU直到引擎崩溃。
正确实现方式
别用while循环,利用Unity的帧循环机制,用布尔变量标记持续移动的状态即可:
private bool isMovingUp = false; [SerializeField] private float JumpForce; private Rigidbody2D rb; void Awake() { rb = GetComponent<Rigidbody2D>(); } void Update() { // 按键按下时开启移动状态 if (Input.GetKeyDown(KeyCode.W)) { isMovingUp = true; } // 按键抬起时关闭移动状态 if (Input.GetKeyUp(KeyCode.W)) { isMovingUp = false; } } void FixedUpdate() { // 在物理更新帧里处理持续加力 if (isMovingUp) { rb.AddForce(Vector2.up * JumpForce); } }
Update仅处理输入事件,只在按键按下/抬起时修改状态标记,不会阻塞线程。FixedUpdate是Unity的物理更新帧,在这里处理刚体的力操作,每一物理帧执行一次,既能实现持续移动,又完全符合Unity的运行机制。
内容的提问来源于stack exchange,提问作者AMFYX X
相关产品推荐
相关产品推荐

