0

我正在尝试从当前位置平稳地移动到我硬编码的新位置,但即使使用Vector3.LerpVector3.MoveTowards它只是正常移动播放器而没有任何延迟效果。

我还尝试在 Vector3.Lerp 方法中添加Time.deltaTime,但它只是稍微移动了玩家。我只是想让玩家平稳地向设定的位置移动。

我是 Unity 的新手,我们将不胜感激任何帮助。

public class PlayerControl : MonoBehaviour {
    //change position
    private float leftX = -1.65f;
    private float leftY = 0.00f;
    private float rightX = -1.00f;
    private float rightY = -1.13f;

    private Vector3 carPosition;
    private float slowTime = 2f;

    void Start () {
        //set the player to its current position
        carPosition = transform.position;
    }

    void Update () {
        //control the player
        if (Input.GetKeyDown(KeyCode.Space) || Input.GetMouseButtonDown(0)) {
            Debug.Log("Pressed!");

            if(transform.position.y <= -0.5) {
                carPosition.x = leftX;
                carPosition.y = leftY;
            }

            if(transform.position.y >= 0) {
                carPosition.x = rightX;
                carPosition.y = rightY;
            }

            //transform.position = carPosition;
            transform.position = Vector3.Lerp(transform.position, carPosition, slowTime);
        }
    }
}
4

3 回答 3

2

你的错误在这里:

transform.position = Vector3.Lerp(transform.position, carPosition, slowTime);

不要使用 transfrom.position 作为参数。使用一些 startPosition 变量,如

transform.position = Vector3.Lerp(startPosition, carPosition, slowTime);

此外,slowTime 应该是钳制到 [0, 1] 的距离的一小部分。当您将 2f 放在那里时,您会立即移动到终点。把 0.5f 放在那里看看我在说什么。

请检查: https ://docs.unity3d.com/ScriptReference/Vector3.Lerp.html

于 2017-03-05T18:32:47.997 回答
1

编辑:重新编写答案以更好地解释如何Lerp工作。

Lerp以一种非常简单的方式工作:让我们调用参数 V1、V2 和 perc - result = Vector3.Lerp(V1, V2, perc)

让我们这么说V1 = (0,0,0)V2 = (1,0,0)perc = 0,2f。使用这些固定参数,您可以得到result = 0.2f,或者换句话说,您可以得到一个 Vector3,从 V1 开始,以 perc 百分比更接近 V2。

现在,如果您想以固定步长将对象从 V1 移动到 V2,则每次Update()调用都需要修改参数percperc例如,如果您想在 5 个单步内到达目的地,那么您需要使用以下:序列调用 Lerp 5 次0.2 - 0.4 - 0.6 - 0.8 - 1。您想使用 10 步移动对象吗?然后你使用序列 0.1 - 0.2 - 0.3 等,你明白了。

但是这种处理方式给了你一个断断续续的动画,所以你想用传递的时间来计算perc参数 every是多少Update(示例代码在 Lukasz 提供的链接中)以获得从开始到的平滑线性运动结尾。

所以你的班级应该是这样的:

using UnityEngine;

public class PlayerControl : MonoBehaviour {    

    private float leftX = -1.65f;
    private float leftY = 0.00f;
    private float rightX = -1.00f;
    private float rightY = -1.13f;
    private float speed = 2f, startTime, totalDistance = 0f;
    private Vector3 carPosition, startPos;

    void Start () {
        carPosition = transform.position;
        startPos = carPosition;
    }

    void Update () {
        if (Input.GetKeyDown (KeyCode.Space) || Input.GetMouseButtonDown (0)) {
            Debug.Log ("Pressed!");
            startTime = Time.time;
            if (transform.position.y <= -0.5) {
                startPos = transform.position;
                carPosition.x = leftX;
                carPosition.y = leftY;
            }
            if (transform.position.y >= 0) {
                startPos = transform.position;
                carPosition.x = rightX;
                carPosition.y = rightY;
            }
            totalDistance = Vector3.Distance(startPos, carPosition);
        }
        if (startPos != carPosition) {
            float newPercentageBetweenVectors = (Time.time - startTime) * speed / totalDistance;
            transform.position = Vector3.Lerp (startPos, carPosition, newPercentageBetweenVectors);
        }
    }
}

使用 Lerp 移动对象的另一种方法是保持固定perc并使用对象的位置作为第一个参数。这将为您提供对数类型的运动,开始时更快,越靠近目的地越慢,但请注意,您将永远无法到达它,因为它是渐近线 - 这意味着您需要自己检查如果当前位置足够接近最终位置特定距离,例如 10^-2,则代码如下:

using UnityEngine;

public class PlayerControl : MonoBehaviour {

    private float leftX = -1.65f;
    private float leftY = 0.00f;
    private float rightX = -1.00f;
    private float rightY = -1.13f;
    private float speed = 2f, totalDistance;
    private Vector3 carPosition;

    void Start () {
        carPosition = transform.position;
    }

    void Update () {
        if (Input.GetKeyDown (KeyCode.Space) || Input.GetMouseButtonDown (0)) {
            Debug.Log ("Pressed!");
            if (transform.position.y <= -0.5) {
                carPosition.x = leftX;
                carPosition.y = leftY;
            }
            if (transform.position.y >= 0) {
                carPosition.x = rightX;
                carPosition.y = rightY;
            }
        }
        if (transform.position != carPosition) {
            transform.position = Vector3.Lerp (transform.position, carPosition, speed * Time.deltaTime);
            totalDistance = Vector3.Distance(transform.position, carPosition);
            if (totalDistance < Mathf.Pow(10,-2)) transform.position = carPosition;
        }
    }
}

Time.deltaTime如果您提供足够低的speed. Lerp 的第二次使用被特别指出(并且实际上被广泛使用)用于将摄像机移向游戏对象。

于 2017-03-05T20:09:15.413 回答
0

这是我学会做的方式:

制作一个新的协程(IEnumerator Title){}。

制作一个名为 t 的浮点数。将其值分配为 0。

做一个while循环:

while(t < 1){

}

输入“t += Time.deltaTime / speed

做 transform.position = Vector3.Lerp(transform.position, carPosition, t);

做收益返回null。

我就是这样学的。你完成的代码应该是这样的:

IEnumerator Drive(){  
    float t = 0;  
    while(t < 1){    
         t += Time.deltaTime / speed;    
         transform.position = Vector3.Lerp(transform.position, carPosition, t);  
         yield return null;     
    }  
}

记住也要启动协程。(StartCoroutine(Drive());

于 2017-06-15T17:34:02.093 回答