如何最小化else if语句的使用?

时间:2019-01-05 16:09:25

标签: c# unity3d

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

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 个答案:

答案 0 :(得分:0)

在没有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)。 / p>

答案 1 :(得分:0)

您担心优化为时过早。就性能而言,@ 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个按钮,如何跟踪?

答案 2 :(得分:-1)

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

bool check(int arr[], int idx, int mod10, int odd2,  int size){ 

  if(idx == size){

     return (mod10 == 0 and odd2 == 1);
}

   // include current element in group A

  bool first_choice = check(arr, idx + 1, (mod10 + arr[idx]) % 10, odd2, size)

   // include  current element in group B

  bool second_choice = check(arr, idx + 1, mod10, (odd2 + arr[idx]) % 2, size)

  return (first_choice or second_choice);    
}

然后要获得指示,只需从集合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()

请注意,如果一次按下多个按钮,将产生异常。您可以在try / catch块中处理此异常。或者,您可以在调用var direction = directionMap.SingleOrDefault(x => x.isInputPressed).directionalValue; 之前验证是否只按下了一个,然后进行相应的操作。