Vector3.Lerp 工作不正常?

Vector3.Lerp not correctly working?

我正在使用 Unity3d,但遇到 Vector3.Lerp 问题。在我的初始代码中,Lerp 代码工作正常,但 PrevView 方法中的第二个 Lerp 无法正常工作。相机只是摇晃并且 returns 到它之前的位置。我哪里出错了?

代码在这里:

using UnityEngine;
using System.Collections;

public class MoveCamera : MonoBehaviour
{
   Vector3 camPos;
   Vector3 startPos; // for storing Camera's first position
   Transform camTr;
   float speed = 5f;**strong text**

void Start()
{
    camTr = Camera.main.transform;
    camPos = camTr.position;
    startPos = camTr.position;
}

void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        RaycastHit hit;
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        if (Physics.Raycast(ray, out hit) && hit.collider.tag == "Buildings")
        {
            var buildings = GameObject.FindGameObjectsWithTag("Buildings");
            foreach (GameObject go in buildings)
            {
                if (go == hit.collider.gameObject)
                {
                    camPos.x = go.transform.position.x;
                    //camPos.y = go.transform.position.y + 30;
                    camPos.z = go.transform.position.z - 20;
                }
                else
                {
                    go.SetActive(false);
                }
            }
        }
    }
    camTr.position = Vector3.Lerp(camTr.position, camPos, Time.deltaTime * speed);
}

public void PrevView()
{
    camTr.position = Vector2.MoveTowards(camTr.position, startPos, Time.deltaTime * speed);
}

}

-首先,它不是 "second Lerp",而是 MoveTowards 函数。

-Lerp 不应该采用 Time.deltaTime * speed 它应该是路径沿途位置的标准化浮点数。

-换句话说,如果您要传递您现在传递的变量,只需使用 MoveTowards

-您的 MoveTowards 函数应该是 Vector3 ,我确定这就是您要输入的内容,对吧?

-PrevView()应该是一个IEnumerator,这样写:

float threshold = 0.01f;
IEnumerator PrevView()
{
    while((camTr.position - startPos).sqrMagnitude > threshold)
    {
        camTr.position = Vector2.MoveTowards(camTr.position, startPos, Time.deltaTime * speed);
        yield return null;
    }
}

然后使用StartCoroutine("PrevView");调用IEnumerator

尝试像这样更改 PrevView 函数:

IEnumerator PrevView()
{
    float threshold = 0;
    float increment = Time.deltaTime * speed;
    while(threshold < 1)
    {
        camTr.position = Vector3.Lerp(camTr.position, startPos, threshold);
        threshold  += increment;
        yield return new WaitForSeconds(0.02f);
    }
}

并用StartCoroutine调用。我还没有测试过,所以如果您遇到问题请告诉我。

我解决了这个问题。非常感谢您尝试帮助我

我的代码在这里:

using UnityEngine;
using System.Collections;

public class MoveCamera : MonoBehaviour
{
    Ray ray;
    RaycastHit hit;
    Vector3 camPos;
    Vector3 startPos; // for storing Camera's first position
    Transform camTr;
    float speed = 2.5f;
    bool b;  // avoiding

void Start()
{
    b = true;
    camTr = Camera.main.transform;
    camPos = camTr.position;
    startPos = camTr.position;
}

void Update()
{
    ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    if (Physics.Raycast(ray, out hit) && Input.GetMouseButtonDown(0))
    {
        if (hit.collider.tag == "Buildings")
        {
            var buildings = GameObject.FindGameObjectsWithTag("Buildings");
            foreach (GameObject go in buildings)
            {
                if (go == hit.collider.gameObject)
                {
                    camPos.x = go.transform.position.x;
                    camPos.y = go.transform.position.y + 30;
                    camPos.z = go.transform.position.z - 20;
                }
                else
                {
                    go.SetActive(false);
                }
            }
        }
    }
    if (b)
    {
        camTr.position = Vector3.Lerp(camTr.position, camPos, Time.deltaTime * speed);
    }
}

public void PrevView()
{
    b = false;
    StartCoroutine("MoveBack");
}

IEnumerator MoveBack()
{
    while ((camTr.position - startPos).sqrMagnitude > 0.01)
    {
        camTr.position = Vector3.MoveTowards(camTr.position, startPos, Time.deltaTime * speed * 10);
        yield return new WaitForSeconds(0.001f);
    }
}

}