2017-10-20 9 views
1

うまく動作するチュートリアルの後にいくつかのコードがありますが、その理由を理解できません。このコードは、単純な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はコメントIで見ることができる理由のまわりで私の頭をラップすることはできませんこのようなことが起きたり、何か他のことが起きた場合には、それが活性化することを理解してください私の理解から、これは直面するだけです=直面する - しかしそれはどのように戻ってくるのですか?

これは正直であると言っていますか!正直なのですが、これがすでに真実であればそれを逆転させますか?

同時に、スケーリングはx軸を1または-1に移動します。コードはそれを一度しか要求しません。どのようにして変更を元に戻すことができますか?これを理解する助けとなることを大変感謝しています。私はこれがこの作品に関連するすべてのコードだと思う。

+0

私は多分あなたは混乱の修飾子と割り当てを取得していると思います。また、1 * -1 = -1となる。しかし、-1 * -1 = 1です。それがどのように反転するかです。 – oxrock

+0

"not true"はfalseです。 「偽ではない」というのは真実です。 – Blorgbeard

+0

ありがとうございました!スケーリングは実際にそれを反転しているのですか?それが反転するたびに、それを反転させる反転のスケーリング、または?ブラ – LocalNerd

答えて

3

コードを理解するには、まず達成しようとしていることを理解する必要があります。具体的には、

  • の場合、文字のhorizontalの移動値が正の場合、文字は画面の右側に移動しています。その場合、文字を右に向けてください。私。 facingrightの値をtrueにします。逆に、値が負の場合、左向きにしたい場合はfacingrightの値をfalseとします。
  • horizontal値が正であるとfacingrightないtrueであれば、我々はそれについて何かをする必要があり、(すなわち、それはfalseだ)、またはhorizontal値が負であり、facingrighttrueです。そうでなければ、そうではない。

&&および||演算子の優先順位を理解することも役立ちます。特に、&&演算子は||より高い優先順位を持ちます。

したがって、ifステートメント— horizontal > 0 && !facingright || horizontal < 0 && facingright —における発現は、コードに上述した第2の箇条書きに変換されます。あなたはそれをより正確に(horizontal > 0 && !facingright) || (horizontal < 0 && facingright)と読むことができます。それは、弾丸の本質です。動き値が「直面している」値と一致するかどうかを確認し、一致しない場合は何かしてください。

それでは、どうしたらいいですか?まず、facingrightの値を逆にすることです。それはfacingright = !facingright;のことです。これにより、フラグが移動方向に一致するように修正されます。

次は、実際にキャラクターが向いている方向を調整することです。投稿したコードでは、これは文字の変換を反転させるだけです。変換から取り出されたスケーリングベクトルの成分を無効にすることは、この効果をもたらす。キャラクタの座標空間がワールド座標空間に対して反転され、その結果キャラクタが通常の外観の一種の鏡像として描かれ、すなわち垂直軸の周りに反転される。声明theScale.x *= -1;theScale.x = theScale.x * -1;と同等です

注意。 xの値が1であれば、新しい値が-1で、値が既に-1であれば、それが戻って1に設定されます。

そしてfacingright値は、移動の実際の方向と同期していない場合にのみ、もちろん、すべてのそのコードが実行されます。何が価値があるために

、私は少し壊れやすいこのコードを見つけるのですか。お互いに同期する必要のある状態変数に依存しないことが私の好みです。ここでは、コードが動き値が正の値から負の値に変化するとき、またはその逆に変化するときに単に気付くことは比較的簡単であろうが、常によりもむしろ動きの方向に対応する絶対的な正または負の値に変換を更新するフラグと変換スケールのx値の両方を無効にします。しかし、それは確かにコードの主観的な評価です。あなたが今持っているコードでは、それ自体が間違っていることはありません。

+0

私は答えを出した。あなたは私にそれを打つ。そのようなシナリオでは、私は通常、自分の答えを他のものよりも良くして(IMO)、それをとにかく投稿します。この場合、誠実に、私はおそらくもっとうまくいくことができませんでした。 +1。 – XenoRo

+0

この非常に詳細な説明をありがとうございます。これらのチュートリアルでは解説されていない説明があるので、私は仕事に就くときにもう少し時間をかけていくつもりですが、今は、対立がその1つのコード列と逆になっていることを少なくとも私は理解しています。 あなたは、フラグを毎回呼び出すのとは対照的に、個人的に方向を変える方法を投稿するつもりはありますか?私はそれの上に行くとき、それは同様に不格好だように感じると非常に感謝するだろう:) – LocalNerd

+0

@LocalNerd:facingright' 'の値を与え、あなたは例えばとして、スケールに直接割り当てることができますtransform.localScale = new Vector3(正面向き?1:-1,1,1); '。たとえば、「直面している」値の代わりに「前の水平値」を保持し、水平値の符号が変化したときにフリップロジックを実行するなど、他のオプションもあります。これは、標準的なStack Overflow Q&Aの範囲をはるかに超え、問題に近づくためのすべての可能な方法を列挙しようとしています。特にコードは基本的に動作しているからです。 –

関連する問題