2016-06-21 44 views
0

我有一個2D遊戲點擊移動遊戲。我想改進我的代碼,以便我的玩家動畫看起來不錯,例如這是我玩家的動畫看起來像的video。正如你所看到的,我的播放器的空閒狀態動畫並不是最好的。視頻還可以讓你看到我的動畫師,以防萬一我在混合樹或轉換過程中犯了錯誤。我該如何改進我的代碼,以便我的播放器的動畫效果不錯,並且我的播放器的空閒狀態動畫面臨着它所面對的正確方向。謝謝!Unity3D:提高玩家的動畫

private Animator anim; 
    public float speed = 15f; 
    private Vector3 target; 
    private bool touched; 
    private bool playerMovementRef; 


    void Start() { 
    target = transform.position; 
    anim = GetComponent<Animator>(); 
} 


    void Update() { 
    if (Input.GetMouseButtonDown (0)) { 
     Vector3 mousePosition = Input.mousePosition; 
     mousePosition.z = 10; // distance from the camera 
     target = Camera.main.ScreenToWorldPoint (mousePosition); 
     target.z = transform.position.z; 

     var movementDirection = (target - transform.position).normalized; 

     if (movementDirection.x != 0 || movementDirection.y != 0) { 
      anim.SetBool ("walking", true); 
     anim.SetFloat ("SpeedX", movementDirection.x); 
     anim.SetFloat ("SpeedY", movementDirection.y); 

     if (movementDirection.x < 0) { 
      anim.SetFloat ("LastMoveX", -1f); 
     } else if (movementDirection.x > 0) { 
      anim.SetFloat ("LastMoveX", 1f); 
     } else { 
      anim.SetFloat ("LastMoveX", 0f); 
     } 
     if (movementDirection.y > 0) { 
      anim.SetFloat ("LastMoveY", 1f); 
     } else if (movementDirection.y < 0) { 
      anim.SetFloat ("LastMoveY", -1f); 
     } else { 
      anim.SetFloat ("LastMoveY", 0f); 
     } 
    } 
} else { 
    if (Mathf.Approximately (transform.position.x, target.x) && Mathf.Approximately (transform.position.y, target.y)) { 
     touched = false; 
     anim.SetBool ("walking", false); 
    } else { 
     transform.position = Vector3.MoveTowards (transform.position, target, speed * Time.deltaTime); 
      } 
     } 
    } 

}

更清楚,我想要做這樣的事情:http://imgur.com/j7gBeDA但我有我的代碼的問題,我很接近,它只是不朝向正確當它它處於空閒狀態。我已經檢查過「是否有退出時間」,這不是,所以我不知道我做錯了什麼。我也確信我debug.log它並沒有給我一個我正在尋找的答案。

回答

0

在你的空閒動畫中,你有一個混合樹,四個不同狀態的自由笛卡兒。問題是你只有四個離散動畫可供選擇,而不是無限的運動範圍,就像3d中的情況一樣。它看起來像是發生的是,你得到每個LastMoveX和LastMoveY的非零值。因爲這個結果會將你的動畫放在混合樹的一個角落 - 在兩個狀態之間。我認爲決定最終結果面臨的唯一方式是浮點不精確。爲了解決這個問題,你可以將空閒狀態的邏輯歸結爲四個組件,一個變量可能會起作用,並且每個動畫都被賦值爲一個值。

1

目前,您正在使用粗糙的if-then塊來設置mechanim控制器中的各種浮動物,最終控制角色朝向的方向。對於都可能(實際上極可能)movementDirection.xmovementDirection.y是非負的。但是,您的動畫面板只有四個方向,因此您需要將2D矢量轉換爲只有一個xy之間的非零值。

Vector3 animDirection = Vector3.zero; 

if (movementDirection.sqrMagnitude > 0) 
{ 
    // Use >= to default to horizontal on both being equal 
    if (movementDirection.x > movementDirection.y) 
     animDirection.x = 1; 
    else 
     animDirection.y = 1; 
} 
+0

謝謝你的回覆,我只是想知道我將在哪裏實現這個到我的代碼?對不起,我更喜歡小菜。我之前有人幫助我,但他或她沒有回覆,我已經等了4個月了。再次感謝您回覆如此迅速,我真的很感激它。 –

+0

這不是「可插入」到你現在的實現中,這種方法是錯誤的,而不是語法/邏輯。如果您不確定如何繼續,我會建議先通過一些Unity教程,而不是處理複雜的2D動畫。 – sloth

+0

謝謝您的提議,但如果您可以更詳細地解釋它,這將非常有幫助。我一直在尋找關於2D RPG點擊移動的統一教程,但我找不到任何。謝謝 –