这个代码如何切换布尔值?

时间:2017-10-20 23:55:42

标签: c# unity3d game-physics

我有一些代码遵循一个很好的教程,但我不明白为什么。代码是根据它的方向从左到右翻转一个简单的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语句有效。你可以在评论中看到我明白,如果发生这种情况或其他事情发生,它会激活。从我的理解来看,这只会使面对面直立 - 面对面 - 但它又是如何回归的!面对面=面向右边?

它是说面朝右=!面对,但如果这已经是真的,那么倒转它?

同时,缩放将x轴移动到1或-1。代码虽然只请求执行一次。它是如何还原变化的?任何理解这一点的帮助将不胜感激。我认为这是与这篇文章相关的所有代码。

1 个答案:

答案 0 :(得分:3)

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

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

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

因此,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值。但这肯定是对代码的主观评估。你现在拥有的代码本身并没有什么不妥。