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

Unity新手求助:枪械上下弹跳动画逐渐偏离初始位置

枪械弹跳动画位置偏移问题解决

问题根源

  • 按住鼠标左键时,Input.GetMouseButton(0)会每帧触发一次,导致你不断启动bouncing协程,多个协程同时修改枪械位置,互相干扰后就会出现偏移。
  • 你的协程是基于当前位置做加减,一旦多个协程交错执行(比如一个协程还没执行“减回去”的操作,另一个已经执行了“加”),就会让位置无法准确回归原位。

修复方案

先在脚本里加两个变量,用来保存初始位置和标记是否正在弹跳:

private Vector3 gunInitialPos;
private bool isBouncing = false;

在Start()方法里初始化枪械的初始位置:

void Start()
{
    gunInitialPos = gun.transform.position;
}

然后修改你的输入检测和协程逻辑:

if (Input.GetMouseButton(0))
{
    // 只有没在弹跳时才启动协程,避免重复触发
    if (!isBouncing)
    {
        StartCoroutine(bouncing());
    }
    gun.GetComponent<Renderer>().material.color = Color.blue;
    range = 80f;
}

if (Input.GetMouseButtonDown(1))
{
    if (!isBouncing)
    {
        StartCoroutine(big_bouncing());
    }
    gun.GetComponent<Renderer>().material.color = Color.red;
    range = 10f;
}

IEnumerator bouncing()
{
    isBouncing = true;
    // 基于初始位置计算弹跳高度,而不是当前位置
    gun.transform.position = new Vector3(gunInitialPos.x, gunInitialPos.y + bounce, gunInitialPos.z);
    yield return new WaitForSeconds(0.1f);
    // 直接回到初始位置,确保不会偏移
    gun.transform.position = gunInitialPos;
    isBouncing = false;
}

IEnumerator big_bouncing()
{
    isBouncing = true;
    gun.transform.position = new Vector3(gunInitialPos.x, gunInitialPos.y + big_bounce, gunInitialPos.z);
    yield return new WaitForSeconds(0.1f);
    gun.transform.position = gunInitialPos;
    isBouncing = false;
}

效果说明

  • 用isBouncing限制同一时间只有一个协程运行,彻底避免多协程干扰。
  • 每次弹跳都以初始位置为基准,结束后直接回到初始点,再也不会出现偏移问题。

初始状态:
初始状态

修复前最终偏移状态:
最终偏移状态

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 12:45:34