Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这段切换布尔值的代码是如何工作的?_C#_Unity3d_Game Physics - Fatal编程技术网

C# 这段切换布尔值的代码是如何工作的?

C# 这段切换布尔值的代码是如何工作的?,c#,unity3d,game-physics,C#,Unity3d,Game Physics,我有一些代码遵循一个很好的教程,但我不明白为什么。代码是使一个简单的2D角色根据其移动方向从左向右翻转 private bool facingright; void Start () { //defaults that we are in fact facing right when game starts. facingright = true; 很明显,它只是表明,当游戏开始时,布尔是真实的。然后,我们创建一个额外的方法来控制它是否为真: private void Fli

我有一些代码遵循一个很好的教程,但我不明白为什么。代码是使一个简单的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;
专用空心翻转(水平浮动){
//如果水平面大于0且不向右。
//或者,如果水平面小于零且朝向右侧
如果(水平>0&&!朝向右侧| |水平<0&&朝向右侧){
//你不再面向右边,但它又是如何返回的呢?
facingright=!facingright;
//缩放正在缩放x轴。
Vector3 theScale=transform.localScale;
//轴变化的值为x*-1
比例x*=-1;
//然后将新值更改为比例?
transform.localScale=比例;
所以,我一辈子都想不明白为什么这个If语句会起作用。你可以在评论中看到,我知道如果发生这种情况或其他事情,它会激活。根据我的理解,这只会使facingright=!facingright-但它如何回到!facingright=facing right

是不是说facingright=!facingright,但如果这已经是真的,那么就把它颠倒过来


同时,缩放会将x轴移动到1或-1。虽然代码只请求执行一次。它如何还原更改?如果有任何帮助,我们将不胜感激。我认为这就是与此相关的所有代码。

要理解代码,您首先需要理解您试图实现的目标ve.具体而言:

  • 如果角色的
    水平
    移动值为正值,则角色将移动到屏幕的右侧。在这种情况下,您希望角色面向右侧。即,您希望
    朝向右侧
    值为
    。相反,如果该值为负值,则您希望朝向左侧,而
    朝向右侧值为
    false
  • 如果
    水平
    值为正,而
    朝向右
    不是
    (即
    ),或者
    水平
    值为负,而
    朝向右
    ,那么我们需要做些什么。否则,就不需要
了解
&
|
运算符的优先顺序也很有帮助。特别是
&
运算符的优先级高于
|

因此,
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
值与实际运动方向不同步时,才会执行所有代码


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

我认为可能您混淆了限定符和赋值。另外,1*-1=-1。然而,-1*-1=1。这就是它翻转的方式。“不正确”是错误的。“不错误”是正确的。谢谢各位!所以缩放实际上是翻转它?在每次翻转之后,缩放反转翻转使其循环,或者?等等。另一种方式是:
facingright=horizontal>0;
(也就是说,如果水平面大于零,则向右看为真,否则为假)。我本打算给出一个答案。你抢先给出了答案;尽管在这种情况下,我通常只会给出比其他人更好的答案(IMO)不管怎样,把它贴出来;在这种情况下,我真诚地说,我不可能做得更好了。+1.非常感谢你的详细解释。我开始工作时会再看几遍,因为这里有一些在这些教程中没有给出的解释,但现在我至少明白了,面部右侧与t相反这是一串代码,你愿意吗