项目中要求实现摄像机跟踪人物移动,并且可以水平360°,上下接近180°的自由旋转。这些操作网上已近有很多版本的实现,在此不再赘述。我在此想说的是,当摄像机移动到场景边界,或者触碰到场景中的障碍物的时候,自动拉近与人物之间的距离,当人物再次走回场景中央的时候,逐渐恢复摄像机与人物之间的距离。
我是通过unity里的光线投射来处理这个问题的。具体的实现代码如下:
private GameObject targetObj = null; //摄像机追踪的游戏对象 private GameObject camera = null; //摄像机 private RaycastHit hit; private string obstacleName = "Obstacle"; //障碍物的名字 private int obstacleLayer = 0; //障碍物所在的Layer private Vector3 offPos = new Vector3(0, 1, 0); //因为人物中心位于脚底,但是希望摄像机以人物要不为观察点,故有此值 Quaternion rotation; //摄像机当前的旋转角度 Vector3 position; //摄像机当前的位置 void LateUpdate(int x) { if (null == targetObj || null == camera) return; rotation = new Quaternion(); //简写 position = Vector3.zero; //这里的position是当人物为触碰场景边界或者障碍物的时候,计算出的是相机的位置,需要计算,这里是简写. //下面对摄像机触碰到场景边界或者障碍物的情况做处理 if (Physics.Linecast(targetObj.transform.position + offPos, position, out hit, 1 << obstacleLayer)) { if (hit.transform.gameObject.name == obstacleName) { position = hit.point; } } camera.transform.position = position; camera.transform.rotation = rotation; }