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
相关产品推荐
相关产品推荐

