You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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#后,再尝试进阶的技巧就好啦!

火山引擎 最新活动