C# Raylib项目中大量if语句的优化与管理方法咨询
C# Raylib项目中大量if语句的优化与管理方法咨询
嘿,我完全懂你现在的困扰——一堆重复的if堆在一起,不仅看着乱糟糟,后续改逻辑也容易漏东西,尤其刚接触C#的时候,很容易陷入这种“判断来判断去”的写法。针对你Raylib里的输入处理代码,我给你几个简单易上手、新手也能快速落地的优化方向,还会附上调整后的代码示例:
1. 先修复代码里的小Bug(避免优化后逻辑还是错的)
先提两个你当前代码里的明显问题,不然优化了也白搭:
- 游戏pad的LeftY判断写重复了:两个if都是
LeftY < 0,应该一个是<0,另一个是>0 - 键盘W/S的移动逻辑有问题:现在按W和S都是
movementV.Y *= movementS,效果完全一样,应该根据按键方向调整向量的正负(比如W是向前,对应movementV.Y -= movementS,S是向后对应movementV.Y += movementS,具体看你坐标系的设定)
2. 用轴值直接计算向量,砍掉重复的正负判断
你现在对游戏pad左右摇杆的正负判断完全没必要——因为GetGamepadAxisMovement返回的是-1到1之间的浮点数,直接用这个值乘以移动速度,就能自动处理正负方向,瞬间砍掉4个if!
优化前(游戏pad移动)
if (Raylib.GetGamepadAxisMovement(0, GamepadAxis.LeftX) < 0) movementV.X *= movementS; if (Raylib.GetGamepadAxisMovement(0, GamepadAxis.LeftX) > 0) movementV.X *= movementS; if (Raylib.GetGamepadAxisMovement(0, GamepadAxis.LeftY) < 0) movementV.Y *= movementS; if (Raylib.GetGamepadAxisMovement(0, GamepadAxis.LeftY) < 0) movementV.Y *= movementS;
优化后(0个判断,直接计算)
float leftX = Raylib.GetGamepadAxisMovement(0, GamepadAxis.LeftX); float leftY = Raylib.GetGamepadAxisMovement(0, GamepadAxis.LeftY); // 注意:摇杆Y轴通常上为负、下为正,这里反转一下符合常规坐标系习惯 movementV.X = leftX * movementS; movementV.Y = -leftY * movementS;
键盘WASD的部分也可以简化,避免重复判断:
优化前(WASD移动)
if (Raylib.IsKeyDown(KeyboardKey.W)) movementV.Y *= movementS; if (Raylib.IsKeyDown(KeyboardKey.S)) movementV.Y *= movementS; if (Raylib.IsKeyDown(KeyboardKey.A)) movementV.X *= movementS; if (Raylib.IsKeyDown(KeyboardKey.D)) movementV.X *= movementS;
优化后(逻辑更清晰,避免重复操作)
// 先重置移动向量,再根据按键叠加方向 movementV = Vector2.Zero; if (Raylib.IsKeyDown(KeyboardKey.W)) movementV.Y -= movementS; if (Raylib.IsKeyDown(KeyboardKey.S)) movementV.Y += movementS; if (Raylib.IsKeyDown(KeyboardKey.A)) movementV.X -= movementS; if (Raylib.IsKeyDown(KeyboardKey.D)) movementV.X += movementS;
3. 把输入逻辑拆成单独方法,让主代码更清爽
把游戏pad和键盘鼠标的输入处理,分别封装成独立的方法,这样主逻辑里就不会堆一堆嵌套if,一眼就能看明白流程,后续改输入逻辑也不用在大堆代码里找。
拆分后的独立方法
// 处理游戏pad输入的专用方法 private void HandleGamepadInput(ref Vector2 rotationV, ref Vector2 movementV, float rotationS, float movementS) { // 摇杆旋转逻辑 rotationV.X = Raylib.GetGamepadAxisMovement(0, GamepadAxis.RightX) * rotationS; rotationV.Y = Raylib.GetGamepadAxisMovement(0, GamepadAxis.RightY) * rotationS; // 摇杆移动逻辑(用上面的轴值直接计算) float leftX = Raylib.GetGamepadAxisMovement(0, GamepadAxis.LeftX); float leftY = Raylib.GetGamepadAxisMovement(0, GamepadAxis.LeftY); movementV.X = leftX * movementS; movementV.Y = -leftY * movementS; } // 处理键盘鼠标输入的专用方法 private void HandleKeyboardMouseInput(ref Vector2 rotationV, ref Vector2 movementV, float rotationS, float movementS) { // 鼠标旋转逻辑 rotationV.X = Raylib.GetMouseDelta().X * rotationS / 10; rotationV.Y = Raylib.GetMouseDelta().Y * rotationS / 10; // WASD移动逻辑 movementV = Vector2.Zero; if (Raylib.IsKeyDown(KeyboardKey.W)) movementV.Y -= movementS; if (Raylib.IsKeyDown(KeyboardKey.S)) movementV.Y += movementS; if (Raylib.IsKeyDown(KeyboardKey.A)) movementV.X -= movementS; if (Raylib.IsKeyDown(KeyboardKey.D)) movementV.X += movementS; }
简化后的主逻辑
现在主代码变得非常简洁,几乎看不到嵌套if:
if (Raylib.IsGamepadAvailable(0)) { HandleGamepadInput(ref rotationV, ref movementV, rotationS, movementS); } else { HandleKeyboardMouseInput(ref rotationV, ref movementV, rotationS, movementS); }
4. 进阶小技巧:用字典映射按键(可选)
如果后续要支持更多按键或者自定义按键,还可以用Dictionary把按键和对应的方向向量映射起来,这样新增按键只需要加字典条目,不用写新的if。这个技巧稍微进阶一点,等你熟悉C#后再尝试也可以:
// 提前定义按键-方向的映射 private Dictionary<KeyboardKey, Vector2> _keyMappings = new Dictionary<KeyboardKey, Vector2> { { KeyboardKey.W, new Vector2(0, -1) }, { KeyboardKey.S, new Vector2(0, 1) }, { KeyboardKey.A, new Vector2(-1, 0) }, { KeyboardKey.D, new Vector2(1, 0) } }; // 处理移动的时候,遍历字典判断按键 movementV = Vector2.Zero; foreach (var mapping in _keyMappings) { if (Raylib.IsKeyDown(mapping.Key)) { movementV += mapping.Value * movementS; } }
最后总结一下:先从砍掉重复的正负判断和拆分方法入手,这两个最容易实现,能立刻让你的代码清爽很多,也更容易维护。慢慢熟悉C#后,再尝试进阶的技巧就好啦!




