Vector3.Lerp不起作用

时间:2017-03-05 18:01:38

标签: c# unity3d lerp

我试图顺利地从目前的位置转移到我已经硬编码的新位置,但即使使用 Vector3.Lerp Vector3.MoveTowards < / strong>它只是正常移动播放器而没有任何延迟效果。

我还尝试在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);
        }
    }
}

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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,或者换句话说,从V1开始,您可以获得更接近V2的Vector3,百分比为perc。

现在,如果您想通过固定步骤将对象从V1移动到V2,则每次Update()调用都需要修改参数perc。例如,如果您想要完全按照5个步骤到达目的地,那么您需要使用此perc0.2 - 0.4 - 0.6 - 0.8 - 1序列调用Lerp 5次。您想使用10个步骤移动对象吗?然后你使用序列0.1 - 0.2 - 0.3等,你明白了。

但是这种做法会给你一个不稳定的动画,所以你想用时间来计算每perc 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特别指出(并且确实广泛使用)将相机移向游戏对象。

答案 2 :(得分:0)

这是我学会这样做的方式:

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

制作名为t的浮点数。将其值指定为0。

制作一个循环:

while(t < 1){

}

键入&#34; t + = Time.deltaTime / speed

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

yield return null。

这就是我学习它的方式。完成的代码应为:

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

还要记得启动Coroutine。 (StartCoroutine(驱动());