最近在做一个自己想做的东西,里面涉及到摄像机的旋转,人物朝着摄像机旋转后的方向行走等等,还要固定摄像机和人物的相对距离不变,并跟随人物移动。
首先需要定义一个Vecto3 relCameraPos,在Start方法中为它赋初值,这就是摄像机和人物的相对朝向吧应该。。。向量的加减法吧,包含朝向和大小
relCameraPos = cameraObject.transform.position - transform.position; //相对朝向和大小的向量
再在输入中定义一个摄像机旋转的输入。
因为摄像机移动的时候人物也需要跟着移动(这个脚本是在人物身上的),而且摄像机需要根据输入绕着人物旋转,并且还需要更新相对距离。
float cam_h = Input.GetAxis("CamRotate"); //摄像机旋转与否
//先更新摄像机的位置和转动,在更新这两个的距离 改朝向
cam_transform.position = relCameraPos + transform.position;
cam_transform.RotateAround(transform.position, Vector3.up, cam_h);
relCameraPos = cameraObject.transform.position - transform.position;
这顺序不能出错,要不得不到想要的结果
然后就是人物的朝向了,因为摄像机是绕着Y轴旋转的,然后人物的朝向在有输入的时候需要朝着摄像机的forward为自身的forward,所以首先获得输入,然后将输入旋转,就是应该的朝向
/*****获得当前方向输入*****/
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
velocity = new Vector3(h, 0, v);
//利用四元数左乘向量来得到目标应该的朝向
float cam_y = cam_transform.rotation.eulerAngles.y;
velocity = Quaternion.Euler(0, cam_y, 0) * velocity;
还有一个是鼠标控制旋转摄像机(也是绕着物体旋转),不过竖直方向旋转有一个限制,两边都不超过80度
/******摄像机视角******/
//获得水平和竖直的鼠标旋转
float cam_h = Input.GetAxis("MouseHorizontal");
float cam_v = Input.GetAxis("MouseVertical");
cam_transform.position = relCameraPos + transform.position;
//视角旋转
//水平旋转
cam_transform.RotateAround(transform.position, Vector3.up, cam_h * 0.5f);
//竖直旋转 ,两边旋转不超过80度
float angleX = cam_transform.rotation.eulerAngles.x;
float nextAngleX = cam_v*0.5f + angleX;
if (nextAngleX >= 360f)
{
nextAngleX -= 360f;
}
if ((nextAngleX < 80f) || (nextAngleX <= 360f && nextAngleX >= 280f) )
cam_transform.RotateAround(transform.position, cam_transform.right, cam_v * 0.5f);
relCameraPos = cameraObject.transform.position - transform.position;
基本就是键盘 或者鼠标控制视角旋转的脚本吧