猿问

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

如何设置方向的值而不必抛出所有其他选项?


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);  }

我需要将玩家输入转化为运动。我不能使用轴,因为我不能像使用这种方法那样轻松地修改它们。


如何优化这段代码?


凤凰求蛊
浏览 213回答 3
3回答

慕桂英4014372

在没有 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 neededdirection = 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)。

喵喵时光机

您对优化的担忧还为时过早。就性能而言,@Christos 的答案是最好的(复制如下)// set the value of 0 to direction from the start and change it if it is neededdirection = 0;if (Input.GetKey(right_button)) {     direction = 1; }if(Input.GetKey(left_button)) {     direction = -1; }这是唯一的优化,因为它从代码路径中删除了一个分支。我想说的是风格和可读性,远离三元运算符(使用 bool ? 1 : 0 语法)。对于返回具有明确条件的清晰可读值的任何内容,它们通常会导致更混乱的代码。在这些不同的实现中要考虑的事情是,如果您希望您的角色仅移动四个方向(假设您可能会向上和向下添加)或支持对角线移动。删除代码中的“else”语句将使您可以沿对角线移动。如果您保留“else if”,那么您将只能在基本方向上移动。如果您只想左右移动,则需要考虑同时按下两者时会发生什么。玩家无处可去?玩家是否朝着最后一次按下的方向移动?如果向上和向下相加,如果按下了 3 个按钮,如何跟踪?

莫回无

您可以定义一个集合来确定哪些输入提供哪个方向:var directionMap = new List<(bool isInputPressed, int directionalValue)>{&nbsp; &nbsp; (Input.GetKey(right_button), 1),&nbsp; &nbsp; (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(),然后相应地继续。
随时随地看视频慕课网APP
我要回答