该代码如何切换布尔工作?

问题描述:

我有一些代码在一个教程,工作正常,但我不明白为什么。代码是让一个简单的2D角色根据它的走向从左到右翻转。该代码如何切换布尔工作?

private bool facingright; 

void Start() { 
    //defaults that we are in fact facing right when game starts. 
    facingright = true; 

很明显,它只是声明游戏开始时布尔值为真。然后,我们创建一个额外的方法来控制,当它是真的还是不是真的:

private void Flip(float horizontal){ 
    //if horizontal is greater than 0 and not facing right. 
    //or if horizontal is less than zero and is facing right 
    if (horizontal > 0 && !facingright || horizontal < 0 && facingright) { 
     //you are no longer facing right, but how does it go back? 
     facingright = !facingright; 

     //theScale is transforming the x axis on scale. 
     Vector3 theScale = transform.localScale; 
     //the value of the axis change is x * -1 
     theScale.x *= -1; 
     //Then change the new value to theScale? 
     transform.localScale = theScale; 

所以,我不能为我的生命换我的头周围为什么这个if语句works.You可以在注释中看到我了解它会在这种情况发生或发生其他事情时激活。根据我的理解,这只会使面对面 - 然而它又如何回到面对面=面向右边?

这是说朝向=!朝向,但如果这已经是真的,然后扭转它?

同时,缩放将x轴移动到1或-1。代码虽然只需要做一次。它如何还原这些更改?任何帮助理解这一点将不胜感激。我认为这是与这件作品有关的所有代码。

+0

我想也许你会得到限定词和作业混淆。另外,1 * -1 = -1。但是,-1 * -1 = 1。这就是它的翻转方式。 – oxrock

+0

“不正确”是错误的。 “不假”是真的。 – Blorgbeard

+0

谢谢你们!所以缩放实际上是翻转它?在每次翻转后,翻转后的缩放会使其循环,或者?等等。 – LocalNerd

要理解代码,您首先需要了解您要实现的目标。具体来说:

  • 如果角色的horizontal移动值是正值,则角色正在移动到屏幕的右侧。在这种情况下,你希望角色面向右侧。即您希望facingright的值为true。相反,如果值为负值,则表示要面向左侧,并且facingright值为false
  • 如果horizontal价值为正facingrighttrue(即它的false),或horizontal值为负,并且facingrighttrue,那么我们需要做的东西。否则,不。

了解&&||操作员的优先顺序也是有帮助的。尤其是,&&运营商的优先级高于||

所以,在if语句— horizontal > 0 && !facingright || horizontal < 0 && facingright —表达被平移第二项目符号点以上成代码。你可以更正确地阅读它,如(horizontal > 0 && !facingright) || (horizontal < 0 && facingright),这是要点的核心。检查移动值是否与“正确的右值”匹配,如果不匹配,请对此做一些处理。

那么,该怎么办呢?那么,首先要反转facingright值。这就是facingright = !facingright;所做的。这修正了标志,使其与运动方向相匹配。

接下来要做的是实际调整角色面对的方向。在你发布的代码中,这只需简单地通过翻转角色的变换来完成。取消从变换中检索的缩放矢量的x分量具有此效果。它使角色的坐标空间相对于世界坐标空间颠倒过来,这又导致角色被描绘成其正常外观的一种镜像,即围绕垂直轴翻转。请注意,theScale.x *= -1;语句相当于theScale.x = theScale.x * -1;。因此,如果x的值为1,则新值为-1,并且如果该值已经为-1,则将其设置回1

当然,只有当facingright值与实际移动方向不同步时,所有代码才会执行​​。

对于它的价值,我发现这个代码有点脆弱。我倾向于不依赖于需要彼此同步的状态变量。在这里,代码要简单地记下移动值何时从正值变为负值或反之亦然,并将变换更新为与移动方向对应的绝对正值或负值,而不是始终否定标志和变换比例值x的值。但这当然是对代码的主观评估。用现在的代码本身没有任何问题。

+0

我正要解雇一个答案。你打败了我;尽管在这种情况下,我通常只是让我的答案比其他人(国际海事组织)更好,然后发布它;在这种情况下,我诚恳地说,我不可能做得更好。 +1。 – XenoRo

+0

非常感谢你对这个非常详细的解释。当我开始工作时,我会再次讨论这个问题,因为这里有些解释并没有在这些教程中给出,但是现在我知道面向对象是用一串代码反转的。 您是否愿意发布如何亲自改变方向与每次调用标志的方式?我觉得它很笨重,当它回过头时,会非常感谢:) – LocalNerd

+0

@LocalNerd:给出'facingright'的值,您可以直接指定到比例尺,例如, transform.localScale = new Vector3(facingright?1:-1,1,1);'。还有其他选项,例如,您保留“先前的水平值”而不是“面向右侧”的值,并在水平值的符号改变时执行翻转逻辑。这有点超出了标准堆栈溢出问题的范围,试图列举解决问题的所有可能方法,特别是因为您拥有的代码基本上正在工作。 –