【问题标题】:How does this code that toggles a boolean work?这个切换布尔值的代码是如何工作的?
【发布时间】:2017-10-20 23:55:41
【问题描述】:

我有一些遵循教程的代码可以正常工作,但我不明白为什么。代码是让一个简单的 2D 角色根据行进的方向从左向右翻转。

private bool facingright;

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

很明显,它只是说明在游戏开始时 bool 为真。然后我们创建一个额外的方法来控制它何时为真或不为真:

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 语句有效。你可以在 cmets 中看到,我知道如果发生这种情况或发生其他事情,它就会激活。根据我的理解,这只会使 facesright = !facingright - 但它又如何回到 !facingright = faces right ?

是不是说 facesright = ! facesright,但如果这已经是真的,那么反过来呢?

同时,缩放将 x 轴移动到 1 或 -1。该代码虽然只要求执行一次。它如何也恢复更改?任何有助于理解这一点的帮助将不胜感激。我想这就是这块相关的所有代码了。

【问题讨论】:

  • 我认为您可能对限定词和作业感到困惑。此外,1 *-1 = -1。但是,-1 * -1 = 1。这就是它的翻转方式。
  • “不正确”是错误的。 “不假”是真的。
  • 谢谢大家!所以缩放实际上是在翻转它?每次翻转后,缩放反转翻转使其循环,或者?废话。
  • 另一种方法是:facingright = horizontal &gt; 0;(这意味着如果水平大于零,则向右为真,否则为假)。

标签: c# unity3d game-physics


【解决方案1】:

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

  • 如果角色的horizontal 移动值为正,则角色正在向屏幕右侧移动。在这种情况下,您希望角色朝右。 IE。您希望 facingright 的值为 true。反之,如果值为负,则您希望面朝左,facingright 的值为false
  • 如果horizontal 值为正且facingright true(即false),或者horizontal 值为负且facingright true,那么我们需要对此做点什么。否则,不是。

了解&amp;&amp;|| 运算符的优先顺序也很有帮助。特别是,&amp;&amp; 运算符的优先级高于||

因此,if 语句中的表达式 — horizontal &gt; 0 &amp;&amp; !facingright || horizontal &lt; 0 &amp;&amp; facingright — 将上面的第二个要点转换为代码。您可以将其阅读为(horizontal &gt; 0 &amp;&amp; !facingright) || (horizontal &lt; 0 &amp;&amp; facingright),这是要点的精髓。检查移动值是否与“面向右侧”值匹配,如果不匹配,则对其进行处理。

那么,该怎么办呢?嗯,第一件事是反转facingright 值。这就是facingright = !facingright; 所做的。这会修复标志,使其与移动方向相匹配。

接下来要做的是实际调整角色面对的方向。在您发布的代码中,只需翻转角色的变换即可完成。否定从变换中检索到的缩放向量的x 分量具有此效果。它会导致角色的坐标空间相对于世界坐标空间发生反转,进而导致角色被绘制为其正常外观的一种镜像,即围绕垂直轴翻转。

请注意,theScale.x *= -1; 语句等同于 theScale.x = theScale.x * -1;。因此,如果x 的值为1,则新值为-1,如果该值已经为-1,则将其设置回1

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

对于它的价值,我确实觉得这段代码有点脆弱。我倾向于不依赖需要彼此同步的状态变量。此处的代码相对简单,只需注意运动值何时从正值变为负值或反之亦然,并将变换更新为对应于运动方向的绝对正值或负值,而不是总是否定标志和变换比例的x 值。但这肯定是对代码的主观评估。您现在拥有的代码本身没有任何问题。

【讨论】:

  • 我正准备回答。你打败了我;尽管在这种情况下,我通常只会让我的答案比其他人更好(IMO)并发布它;在这种情况下,真诚地,我不可能做得更好。 +1。
  • 非常感谢您提供如此详细的解释。当我开始工作时,我会再复习几次,因为这里有这些教程中没有给出的解释,但现在我至少明白了,面对权与那一串代码是相反的。你愿意发布你个人如何改变方向而不是每次都叫旗吗?我觉得它在检查它时也很笨重,非常感谢:)
  • @LocalNerd:给定facingright 的值,您可以直接分配给比例,例如transform.localScale = new Vector3(面向右?1:-1、1、1);`。还有其他选项,例如,您保留“先前的水平值”而不是“面向右侧”的值,并在水平值的符号发生变化时执行翻转逻辑。尝试列举解决问题的所有可能方法有点超出标准 Stack Overflow Q&A 的范围,特别是因为您拥有的代码基本上可以工作。
猜你喜欢
  • 2016-10-27
  • 1970-01-01
  • 2012-07-21
  • 2013-09-02
  • 1970-01-01
  • 2010-12-13
  • 2013-04-23
  • 2015-04-09
  • 2013-07-24
相关资源
最近更新 更多