我想让相机在点击UI按钮后移动到某个位置。对于定位,我使用空的游戏对象(CameraPositionStart和CameraPositionFinish)坐标。由于某些原因,相机只是瞬间移动到需要的位置,而不是平稳地移动到它。下面是我的代码:
using UnityEngine;
using UnityEngine.UI;
public class CameraMover : MonoBehaviour
{
public float speed;
public Button ButtonStartNew;
public GameObject CameraPositionStart;
public GameObject CameraPositionFinish;
private void Update()
{
ButtonStartNew.onClick.AddListener(moveCamera);
}
public void moveCamera()
{
transform.position = Vector3.Lerp(transform.position, CameraPositionFinish.transform.position, Time.deltaTime * speed);
}
}
这种行为可能由两个原因引起。
方法Update
每帧执行一次。这里每帧您正在添加一个应该在单击UI上的按钮时进行的额外调用。我怀疑,这样做的结果是,当几百个调用moveCamera
都同时发生时,尽管moveCamera
只通过Lerp(Time.DeltaTime * Speed)
移动变换-对象移动更接近(因为你在打嗝)因为你叫它一堆
private void Update()
{
ButtonStartNew.onClick.AddListener(moveCamera);
}
考虑只在on click事件中添加一个对moveCamera
的调用。我们可以在Start
或Awake
中这样做,因为它们只被调用一次。
private void Start()
{
ButtonStartNew.onClick.AddListener(moveCamera);
}
然而,这并不能解决问题。因为如果我们这样做,moveCamera
将只被调用一次,结果将是相机将非常轻微地向目标移动并停止。
考虑实现一个Coroutine
,它会随着时间(每一帧)移动变换,直到它到达目标。
private void moveCamera()
{
// A coroutine runs every frame until it stops returning values
StartCoroutine(MoveCamera);
}
private IEnumerator MoveCamera()
{
// check the distance and see if we still need to move towards the destination
while(Vector3.Distance(transform.position, CameraPositionFinish.transform.position) > 1.0f)
{
transform.position = Vector3.Lerp(transform.position, CameraPositionFinish.transform.position, Time.deltaTime * speed);
// Return nothing meaningful and wait until next frame
yield return null;
}
}