鼠标滚轮仅单向生效?武器数组滚轮切换无法逐个循环问题
解决鼠标滚轮循环切换武器的问题
嘿,我帮你捋一捋这个武器切换的问题~你的代码逻辑思路是对的,但有几个小细节导致索引不能正确逐个递增/递减:
问题出在哪?
- 后置自增/自减的坑:你用了
activeWeaponIndex++和activeWeaponIndex--,这两个是先返回当前值,再修改变量。比如在三元运算符里,当条件满足时,你返回的是旧的索引值,然后才给变量加1,等于赋值的时候根本没用到更新后的索引,自然没法正确切换。 - 硬编码索引值:递减分支里写死了
activeWeaponIndex = 3,如果以后武器数组长度变了(比如加了一把武器),这个逻辑直接就崩了,得用动态的weapons.Length - 1来获取最后一个索引。
修正方案1:修复原条件判断逻辑
把后置自增改成直接计算新索引,同时替换硬编码值:
void Update() { var d = Input.GetAxis("Mouse ScrollWheel"); //鼠标滚轮输入 if (d > 0f) { // 先判断是否到达最后一个索引,是就回到0,否则索引+1 activeWeaponIndex = (activeWeaponIndex + 1 >= weapons.Length) ? 0 : activeWeaponIndex + 1; } else if (d < 0f) { // 先判断是否到达第一个索引,是就跳到最后一个,否则索引-1 activeWeaponIndex = (activeWeaponIndex - 1 < 0) ? weapons.Length - 1 : activeWeaponIndex - 1; } Swap(activeWeaponIndex); //切换武器 }
修正方案2:用取模运算实现更优雅的循环
取模运算可以自动帮我们处理循环逻辑,代码更简洁,也不容易出错:
void Update() { var d = Input.GetAxis("Mouse ScrollWheel"); //鼠标滚轮输入 if (d > 0f) { // (当前索引+1)对数组长度取模,超出后自动回到0 activeWeaponIndex = (activeWeaponIndex + 1) % weapons.Length; } else if (d < 0f) { // 递减时先加数组长度再取模,避免出现负数索引 activeWeaponIndex = (activeWeaponIndex - 1 + weapons.Length) % weapons.Length; } Swap(activeWeaponIndex); //切换武器 }
为什么递减要加数组长度?因为如果当前索引是0,减1会变成-1,直接取模会得到负数,加上数组长度后再取模就能得到最后一个合法索引(比如数组长度为4时,(0-1+4)%4=3,正好是最后一把武器的索引)。
额外小优化:避免滚轮误触
鼠标滚轮有时候会有轻微抖动,导致d出现很小的数值,你可以加个判断忽略这些微小输入:
void Update() { var d = Input.GetAxis("Mouse ScrollWheel"); //鼠标滚轮输入 // 忽略微小的滚轮输入,防止误切换 if (Mathf.Abs(d) < 0.1f) return; if (d > 0f) { activeWeaponIndex = (activeWeaponIndex + 1) % weapons.Length; } else if (d < 0f) { activeWeaponIndex = (activeWeaponIndex - 1 + weapons.Length) % weapons.Length; } Swap(activeWeaponIndex); //切换武器 }
内容的提问来源于stack exchange,提问作者L. Birkett
相关产品推荐
相关产品推荐

