最近在做一个场景展示的项目,需要实现自动游览的效果,即摄像机在场景中预设好的点之间进行自动移动,觉得网上应该有现成的,竟然没找到。只能自力更生了,不过难度不大。大体思路为:
- 设置目标点
- 判断当前位置是否到达下一个目标点
- 若是,改变相机朝向,否则往前移动。
上代码:
private float speed = 5f; //移动速度
private bool isShow = false; //标志位,当按下按键时开始自动浏览
private int i = 0; //到目标点后,加一
private float[,] curPosition = new float[5, 3]; //二维数组用于存储游览点的序号和位置信息,其中curPosition表示当前点信息
private float[,] storePositon = new float[5, 3] {{1f,3f,4f} , //存储所有点的信息
{6f,3f,1f} ,
{5f,3f,2f} ,
{5f,3f,4f} ,
{4f,3f,4f}} ;
在Start()方法中,初始化curPosition
for(int i = 0; i < curPosition.GetLength(0);i++) //GetLength返回行列
{
for(int j = 0; j < curPosition.GetLength(1); j++)
{
curPosition [i,j] = storePositon[i,j]; //先赋值相机的初始化点
}
}
Update()方法中
if (Input.GetKey (KeyCode.Y))
isShow = true;
if(isShow)
{
if (i == storePositon.GetLength (0)-1) //游览完毕
return;
//当前相机的位置十分接近目标位置,无法保证准确重合,因此给予0.05的波动范围
if (((transform.position.x <= storePositon[i,0]-0.05f) || (transform.position.x >= storePositon[i,0]+0.05f)) ||
((transform.position.z <= storePositon[i,2]-0.05f) || (transform.position.z >= storePositon[i,2]+0.05f)))
{
transform.Translate(Vector3.forward * Time.deltaTime *speed);
}
else
{
transform.position = new Vector3 (storePositon [i, 0], storePositon [i, 1], storePositon [i, 2]); //调整相机位置,保证LookAt()的角度准确性
Vector3 ps = new Vector3 (storePositon [i+1, 0], storePositon [i+1, 1], storePositon [i+1, 2]);
transform.LookAt (ps);
++i;
}
}
把代码挂载到相机上即可,由于场景是公司项目,不便展示,因此随便搭了一个场景,有需要的可以下载看看。
https://download.csdn.net/download/s1314_jhc/10477057
自动游览的效果如下
![](https://i-blog.csdnimg.cn/blog_migrate/011629b6b629566958029765dcabb4fd.gif)