2017-09-21 68 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