Vector3.Lerp没有正常工作?

时间:2015-08-18 19:48:06

标签: unity3d lerp

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

代码在这里:

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

}

3 个答案:

答案 0 :(得分:2)

- 首先,它不是"第二个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

答案 1 :(得分:0)

尝试更改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调用它。我没有经过测试,所以如果你遇到麻烦请告诉我。

答案 2 :(得分:0)

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

我的代码在这里:

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

}