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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 18:45:43