2017-10-20 62 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可以在註釋中看到我瞭解它會在這種情況發生或發生其他事情時激活。根據我的理解,這隻會使面對面 - 然而它又如何回到面對面=面向右邊?

這是說朝向=!朝向,但如果這已經是真的,然後扭轉它?

同時,縮放將x軸移動到1或-1。代碼雖然只需要做一次。它如何還原這些更改?任何幫助理解這一點將不勝感激。我認爲這是與這件作品有關的所有代碼。

+0

我想也許你會得到限定詞和作業混淆。另外,1 * -1 = -1。但是,-1 * -1 = 1。這就是它的翻轉方式。 – oxrock

+0

「不正確」是錯誤的。 「不假」是真的。 – Blorgbeard

+0

謝謝你們!所以縮放實際上是翻轉它?在每次翻轉後,翻轉後的縮放會使其循環,或者?等等。 – LocalNerd

回答

3

要理解代碼,您首先需要了解您要實現的目標。具體來說:

  • 如果角色的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);'。還有其他選項,例如,您保留「先前的水平值」而不是「面向右側」的值,並在水平值的符號改變時執行翻轉邏輯。這有點超出了標準堆棧溢出問題的範圍,試圖列舉解決問題的所有可能方法,特別是因爲您擁有的代碼基本上正在工作。 –