我正在使用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);
}
}
答案 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);
}
}
}