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