我的场景中有一个按钮、一个主相机和一个空的游戏对象。
每当我点击那个按钮时,我的相机应该慢慢地移到那个空的游戏对象的位置。
我的相机正停在那个位置,这很好,但问题是我必须多次点击那个按钮,直到我的相机到达它的位置。那么有没有办法通过单击该按钮将我的相机移动到游戏对象的位置?
这是我的代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TransitionCAM : MonoBehaviour {
public Transform views;
public float transitionSPEED;
Transform currentVIEW;
public void move(){
currentVIEW = views;
transform.position = Vector3.Lerp (transform.position, currentVIEW.position, Time.deltaTime * transitionSPEED);
//for camera rotation
Vector3 currentangel = new Vector3 ( Mathf.LerpAngle(transform.rotation.eulerAngles.x, currentVIEW.transform.rotation.eulerAngles.x, Time.deltaTime *transitionSPEED),
Mathf.LerpAngle(transform.rotation.eulerAngles.y, currentVIEW.transform.rotation.eulerAngles.y, Time.deltaTime *transitionSPEED),
Mathf.LerpAngle(transform.rotation.eulerAngles.z, currentVIEW.transform.rotation.eulerAngles.z, Time.deltaTime *transitionSPEED));
transform.eulerAngles = currentangel;
}
}
问题是你Vector3.Lerp
只跑一次。试试这个:
public Transform views;
public float transitionSPEED;
Transform currentVIEW;
private bool flag = false;
Vector3 currentangel;
private void Start()
{
Debug.Log(flag);
currentVIEW = views;
}
private void Update()
{
if (flag == true)
{
transform.position = Vector3.Lerp(transform.position, currentVIEW.position, Time.deltaTime * transitionSPEED);
Debug.Log("object pos" + transform.position);
Debug.Log(currentVIEW.position);
//for camera rotation
currentangel = new Vector3(Mathf.LerpAngle(transform.rotation.eulerAngles.x, currentVIEW.transform.rotation.eulerAngles.x, Time.deltaTime * transitionSPEED),
Mathf.LerpAngle(transform.rotation.eulerAngles.y, currentVIEW.transform.rotation.eulerAngles.y, Time.deltaTime * transitionSPEED),
Mathf.LerpAngle(transform.rotation.eulerAngles.z, currentVIEW.transform.rotation.eulerAngles.z, Time.deltaTime * transitionSPEED));
transform.eulerAngles = currentangel;
}
}
public void Move()
{
flag = true;
}
当您的相机处于正确位置时,您必须想出一种方法来停止 lerping。因为if (flag == true)
按下按钮后这将始终为真。
这是一个更好的解决方案,我相信使用协程
public Transform views;
public float transitionSPEED;
Transform currentVIEW;
private bool flag = false;
private bool isStarted = false;
Vector3 currentangel;
private void Start()
{
Debug.Log(flag);
currentVIEW = views;
}
private void Update()
{
if (flag && !isStarted)
{
StartCoroutine(CoroutineSolution());
isStarted = true;
}
}
IEnumerator CoroutineSolution()
{
float t = 0.0f;
while ( t<1.0f )
{
t += Time.deltaTime;
transform.position = Vector3.Lerp(transform.position, currentVIEW.position, t);
//for camera rotation
currentangel = new Vector3(Mathf.LerpAngle(transform.rotation.eulerAngles.x, currentVIEW.transform.rotation.eulerAngles.x, t),
Mathf.LerpAngle(transform.rotation.eulerAngles.y, currentVIEW.transform.rotation.eulerAngles.y, t),
Mathf.LerpAngle(transform.rotation.eulerAngles.z, currentVIEW.transform.rotation.eulerAngles.z, t));
transform.eulerAngles = currentangel;
Debug.Log("Coroutine running");
yield return null;
}
}
public void Move()
{
flag = true;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句