今天主要是简单的模拟下吃鸡游戏的第三人称摄像机的实现。
观察
我们玩过吃鸡手游的都知道,吃鸡的人物跟随的摄像机有两种状态
1. 滑动屏幕的时候,摄像机左右上下移动,人物也会跟随着左右移动,上下抬头低头(播放相应的动画,但是不上下移动)。摄像机始终保持着观察人物背面。左右可以360度旋转,上下会有个最大值和最小值的限制,无法达到0度往上看或90度往下看。
2. 按住拖动右上角小眼睛按钮,摄像机左右上下移动,人物不会跟随着左右转动,头会左右上下摆动。几乎可以360度观察人物。上下左右的限制与情况1相同。
在不考虑头部转动的情况下,可以总结出两种情况摄像机的转动围绕人物的规则都是一样的,即以一个固定半径形成的球面上移动,除去了球面的最上和最下的部分,视角始终看向球心。而当滑动屏幕的情况下,人物也随之左右自转,保持摄像机观察人物的正背面。
分析
根据表现的现象,我们可以分析出我们需要实现的逻辑。我们可以想象人物的正后面有一条直线line,方向为(0,0,-1),摄像机离人物距离为distance,初始值摄像机的位置为(0,0,-distance)
当摄像机进行360度移动的时候,我们可以把移动操作拆分为两个步骤,首先是摄像机垂直移动,即以人物为中心,半径为distance的圆上移动。设垂直角度为α(0<min<α<max<90),则摄像机的高度y轴为distance*sin α,离人物的z轴距离为distance*cos α。此时摄像机的位置为(0,distance*sin α,-distance*cos α)
然后在之前的基础上,我们对摄像头进行水平移动,即以人物头顶高度distance*sin α的点为中心,半径为distance*cos α的圆上移动。设水平角度为β,则摄像机x轴为distance*cos α * sin β,z轴距离则更新为distance*cos α * cos β。
所以我们可以用两个角度α,β,来控制摄像机的转动,上下移动更新α值,左右移动更新β值,摄像机的位置为(distance*cos α * sin β, distance*sin α, -distance*cos α * cos β),摄像机始终看向(LookAt)人物
接着我们要区分两种情况的人物状态,当滑动屏幕的时候,人物会随之一起反方向转动,从而保证摄像机始终观察着人物背面。所以当摄像机水平转了β度时,人物的转向应该为(0, -β, 0)。而按住小眼睛的时候,人物不需要随之移动,但是当松开小眼睛的时候,摄像头需要回归原始位置,所以在按下的时候,我们需要纪录按下时摄像机的偏移角度,以供松开时复原。
实现
Demo中我们一共有四个cs文件,一个控制小眼睛按钮,一个控制屏幕滑动,一个控制人物移动,最后一个就是控制摄像机了。
还有需要搭建一个简单的测试场景,里面有一个方块模拟角色,一个plane做地面,然后添加一个UGUI的Button做小眼睛按钮。
首先是人物移动的控制器PlayerController,就是做了简单的位移
using UnityEngi