2017-09-21 107 views
1

燮transform.translate太快。當我按下C按鈕時,我的精靈速度過快。這是一隻狼,將作爲攻擊刺探。但它只是從一個地方到另一個地方,而我的想法是我完全使用了錯誤的代碼。我猜它必須用Rigidbody2D = new Vector2做更多......但我不知道從那裏去哪裏。以下是我目前正在處理的內容。2D精靈去與C#腳本(單位)

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 
using UnityEngine.UI; 

public class tulMoveMount : MonoBehaviour { 

    private Animator anim; 
    private Rigidbody2D rb; 

    private bool goRight = true; 
    private bool jump = false; 
    private bool idle = true; 
    public float lungeDistance; 
    public float lungeSpeed; 
    public float lungeHeight; 

    void Start() 
    { 
     anim = GetComponent<Animator>(); 
     rb = GetComponent<Rigidbody2D>(); 
    } 

    void Update() 
    { 
     HandleCommands(); 
    } 


    void HandleCommands() 
    { 
     if (!jump && goRight && Input.GetKeyDown (KeyCode.C)) { 
      idle = false; 
      jump = true; 
      anim.SetTrigger ("jump"); 
      rb = transform.Translate (lungeSpeed + lungeDistance, lungeHeight, 0); // HERE 
      idle = true; 
      jump = false; 
      anim.SetTrigger ("idle"); 
     } 
     if (!jump && !goRight && Input.GetKeyDown (KeyCode.C)) { 
      idle = false; 
      jump = true; 
      anim.SetTrigger ("jump"); 
      rb = transform.Translate (lungeSpeed + -lungeDistance, lungeHeight, 0); // HERE 
      idle = true; 
      jump = false; 
      anim.SetTrigger ("idle"); 
     } 
    } 
} 

回答

1

要想從一個點到另一個點的平穩轉換,你可以使用一個Lerp裏面Corouting

在線性插值的第一個參數是開始位置和第二的圓盾。第三個參數是0和1之間的浮點數。如果它是0,則在Lerp中獲得第一個參數。如果它是1,你會得到第二個。如果兩者之間的中間點爲0.5等等......

所以你需要做的是啓動一個courutine,它將獨立於fps率,並且將以一個固定的速度移動你的GameObject,起始目標與您希望從一個目標移到另一個目標所需的時間之間的距離。

public class WolfMovement : MonoBehaviour { 

    Vector3 start; 
    Vector3 target; 

    float lungeSpeed = .8f; 
    float lungeDistance = 5; 

    private IEnumerator coroutine; 

    void Update() { 
     if(Input.GetKeyDown(KeyCode.M)) 
     { 
      start = transform.position; 
      target = new Vector3(transform.position.x + lungeDistance,transform.position.y , transform.position.z); 

      coroutine = MoveObject(start,target,lungeSpeed); 
      StartCoroutine(coroutine); 

     } 
    } 

    IEnumerator MoveObject (Vector3 start, Vector3 target, float speed){ 
     float i = 0.0f; 
     float rate = 1.0f/speed; 
     while (i < 1.0) { 
      i += Time.deltaTime * rate; 
      transform.position = Vector3.Lerp(start, target, i); 
      yield return null; 
     } 
    } 

} 
+1

好的。你基本上只是給了我整個代碼並解決了問題。我不知道你是從哪裏來的超級英雄,但是感謝大聲笑 –

+0

@JoeClark哈哈。不用謝。我試圖解決你以及你翻轉2D Sprite的問題,但不確定接近的工作 –

1

Time.DeltaTime乘以翻譯將順利過許多幀的運動,然後你就只需要調整的lungeSpeed得到你想要的速度。

rb = transform.Translate ((lungeSpeed + lungeDistance, lungeHeight, 0)*Time.deltaTime); 
+0

啊!我早些時候嘗試過,但由於某種原因,它只是不喜歡,並不斷給我一個錯誤消息。我現在在學校使用cpu,但這可能是問題所在。自從我在其中插入項目後,我已經看到了很多人。當我有機會回到你身邊的時候,我會在家裏使用它。感謝您的反饋 –

+0

@JoeClark您可能需要在這行上放置'* Time.deltaTime'來獲得您要查找的效果。 – Bejasc