为了账号安全,请及时绑定邮箱和手机立即绑定

我如何尽量减少 else if 语句的使用?

我如何尽量减少 else if 语句的使用?

C#
凤凰求蛊 2022-07-10 10:08:41
如何设置方向的值而不必抛出所有其他选项?if (Input.GetKey(right_button)) { direction = 1; }else if(Input.GetKey(left_button)) { direction = -1; }        else { direction = 0; }if (direction!=0) { rb.velocity = new Vector2(player_speed*direction, rb.velocity.y);  }我需要将玩家输入转化为运动。我不能使用轴,因为我不能像使用这种方法那样轻松地修改它们。如何优化这段代码?
查看完整描述

3 回答

?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

在没有 if/else 的情况下编写上述内容的另一种方法如下:


direction = Input.GetKey(right_button) 

                ? 1

                : Input.GetKey(left_button)

                      ? -1 

                      : 0;

我不知道这是否更具可读性。在这种情况下,我认为这是您希望如何编写这段代码的偏好,而不是确定更具可读性。换句话说,我不认为 if/else 语句不可读——作为一个小小的修改,我建议你将正文放在另一行而不是同一行——但这又是个人喜好:)。


if (Input.GetKey(right_button)) 

    direction = 1; 

}

else if(Input.GetKey(left_button)) 

    direction = -1; 

}

else 

    direction = 0; 

}

关于您的第二个问题,您的代码中没有任何性能问题。


另一种方法如下:


// set the value of 0 to direction from the start and change it if it is needed

direction = 0;

if (Input.GetKey(right_button)) 

    direction = 1; 

}

if(Input.GetKey(left_button)) 

    direction = -1; 

}

本质上direction,我们从一开始就将 的值设置为 0,并且仅在需要时才重新设置该值(Input.GetKey(right_button)或者Input.GetKey(left_button)返回 true)。


查看完整回答
反对 回复 2022-07-10
?
喵喵时光机

TA贡献1846条经验 获得超7个赞

您对优化的担忧还为时过早。就性能而言,@Christos 的答案是最好的(复制如下)


// set the value of 0 to direction from the start and change it if it is needed

direction = 0;

if (Input.GetKey(right_button)) 

    direction = 1; 

}

if(Input.GetKey(left_button)) 

    direction = -1; 

}

这是唯一的优化,因为它从代码路径中删除了一个分支。


我想说的是风格和可读性,远离三元运算符(使用 bool ? 1 : 0 语法)。对于返回具有明确条件的清晰可读值的任何内容,它们通常会导致更混乱的代码。


在这些不同的实现中要考虑的事情是,如果您希望您的角色仅移动四个方向(假设您可能会向上和向下添加)或支持对角线移动。删除代码中的“else”语句将使您可以沿对角线移动。如果您保留“else if”,那么您将只能在基本方向上移动。如果您只想左右移动,则需要考虑同时按下两者时会发生什么。玩家无处可去?玩家是否朝着最后一次按下的方向移动?如果向上和向下相加,如果按下了 3 个按钮,如何跟踪?


查看完整回答
反对 回复 2022-07-10
?
莫回无

TA贡献1865条经验 获得超7个赞

您可以定义一个集合来确定哪些输入提供哪个方向:


var directionMap = new List<(bool isInputPressed, int directionalValue)>

{

    (Input.GetKey(right_button), 1),

    (Input.GetKey(left_button), -1)

};

然后要获得方向,您只需directionalValue从集合中的记录中获取isInputPressed正确的位置:


var direction = directionMap.Where(x => x.isInputPressed).Sum(x => x.directionalValue);

如果同时按下两个按钮,在此处使用.Where()可能会产生意想不到的结果。如果这永远不会发生,您可以更改上面的内容以使用.SingleOrDefault():


var direction = directionMap.SingleOrDefault(x => x.isInputPressed).directionalValue;

请注意,如果一次按下多个按钮,这将产生异常。您可以在 try/catch 块中处理此异常。或者您可以在调用之前验证是否只按下了一个.SingleOrDefault(),然后相应地继续。


查看完整回答
反对 回复 2022-07-10
  • 3 回答
  • 0 关注
  • 212 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信