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

Unity中首次调用SelectGravity()函数重复执行问题求助

Unity首次调用SelectGravity()重复执行2-3次的问题解决

问题分析

你遇到的核心问题是输入检测逻辑依赖了轴的持续状态,而非单次按键按下事件。Input.GetAxisRaw("RotatoWorld")在按键按住的每帧都会返回非零值,首次运行时可能因为输入设备初始状态或脚本执行顺序的微小异常,导致连续多帧触发判断逻辑,进而重复调用SelectGravity()。后续运行正常是因为旋转协程启动后,IsRotating被设为true,阻止了后续触发,但首次初始化阶段的输入状态稳定性不足,引发了重复执行。

解决方案

方案1:改用单次按键按下检测(推荐)

放弃依赖Input.GetAxisRaw的持续值,改用Input.GetKeyDown检测单次按键按下事件,确保只有按键按下的第一帧才触发逻辑:

void Update()
{
    // 根据你的输入轴配置,替换成对应的按键(比如左右箭头/A/D)
    bool rotateClockwise = Input.GetKeyDown(KeyCode.RightArrow);
    bool rotateCounterClockwise = Input.GetKeyDown(KeyCode.LeftArrow);

    if ((rotateClockwise || rotateCounterClockwise) && !IsRotating)
    {
        IsRotating = true;
        // 给Rotation赋值,供协程判断旋转方向
        Rotation = rotateClockwise ? 1 : -1;
        SelectGravity();
    }

    Physics2D.gravity = new Vector2(XGravity, YGravity);
}

方案2:触发后立即重置输入值

如果坚持使用Input.GetAxisRaw,在触发逻辑后立即重置Rotation的值,避免后续帧检测到非零值:

void Update()
{
    Rotation = Input.GetAxisRaw("RotatoWorld");

    if (Rotation != 0 && !IsRotating)
    {
        IsRotating = true;
        Rotation = 0; // 重置输入值,防止后续帧重复触发
        SelectGravity();
    }

    Physics2D.gravity = new Vector2(XGravity, YGravity);
}

方案3:确认脚本执行顺序

确保ChangeGravity脚本的初始化逻辑先于Update执行:

  1. 打开Edit -> Project Settings -> Script Execution Order
  2. 将ChangeGravity脚本添加到列表中,调整顺序到默认组之前,保证Start里的IsRotating = false初始化先完成

方案4:排查SelectGravity()内部逻辑

确认SelectGravity()函数中没有意外修改IsRotating的值,也没有调用任何会重置该变量的代码。

内容的提问来源于stack exchange,提问作者traponsix

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 02:41:06