2d 精灵在 C# 脚本(统一)中使用 transform.translate 太快了

2d sprite goes too fast with transform.translate in C# script (unity)

上。当我按下 C 按钮时,我的 sprite 变得太快了。这是一头会冲刺攻击的狼。但它只是从一个地方到另一个地方,我觉得我只是完全使用了错误的代码。我猜它必须与 Rigidbody2D = new Vector2 做更多事情......但我不知道从那里去哪里。这是我目前正在使用的东西。

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");
        }
    }
}

将平移乘以 Time.DeltaTime 将使多帧的移动变得平滑,然后您只需调整 lungeSpeed 即可获得您想要的速度。

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

要获得从一个点到另一个点的平滑转换,您可以使用 Lerp inside a Corouting

在 Lerp 中,第一个参数是起始位置,第二个参数是目标。第三个参数是一个介于 0 和 1 之间的浮点数。如果它是 0,您将获得 Lerp 中的第一个参数。如果它是 1,你得到第二个。如果 0.5 是两者之间的中间点,依此类推...

所以你需要做的是启动一个协程,它将独立于 fps 速率,并以恒定速度移动你的游戏对象,该速度由开始目标和你想要的时间之间的距离定义从一个移动到另一个。

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;
        }
    }

}