最近在做一个场景展示的项目,需要实现自动游览的效果,即摄像机在场景中预设好的点之间进行自动移动,觉得网上应该有现成的,竟然没找到。只能自力更生了,不过难度不大。大体思路为:
- 设置目标点
- 判断当前位置是否到达下一个目标点
- 若是,改变相机朝向,否则往前移动。
上代码:
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
自动游览的效果如下
转载请标明出处:U3D中实现场景自动游览的效果
文章来源: U3D中实现场景自动游览的效果