3 回答
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)。
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 个按钮,如何跟踪?
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(),然后相应地继续。
- 3 回答
- 0 关注
- 212 浏览
添加回答
举报