相机的跟随效果在绝大多的游戏上都是可见的,今天了解关于摄像机视角的挪动和摄像机跟随玩家移动的新方式。也可以说是创新
private Vector3 pos;//摄像机准备照射的位置,相机看向的位置
//相机跟随玩家移动(玩家位置+世界坐标的y轴-玩家的前方)
固定的套用公式
pos = player.transform.position+ Vector3.up * up-player.transform.forward*away;
transform.LookAt(player.transform.position)
等价于
Quaternion q = Quaternion.LookRotation(player.transform.position - transform.position/*, transform.up*/);
//球型插值
transform.rotation = Quaternion.Slerp(transform.rotation, q, Time.deltaTime * speed);
而后者更加精确完善,效果差不多。
private GameObject player;//玩家
private Vector3 pos;//摄像机准备照射的位置
private Vector3 cameraRoation;
public float up, away,speed;
void Start()
{
player = GameObject.FindWithTag("Player");
}
void Update()
{
//相机跟随玩家移动(玩家位置+世界坐标的y轴-玩家的前方)
pos = player.transform.position+ Vector3.up * up-player.transform.forward*away;
//差值
transform.position = Vector3.Lerp(transform.position, pos, Time.deltaTime * speed);
//transform.LookAt(player.transform.position);
//跟随旋转
Quaternion q = Quaternion.LookRotation(player.transform.position - transform.position/*, transform.up*/);
//球型插值
transform.rotation = Quaternion.Slerp(transform.rotation, q, Time.deltaTime * speed);
camer();//鼠标事件
}
void camer()
{
//鼠标横纵轴移动
float x = Input.GetAxis("Mouse X");
float y = Input.GetAxis("Mouse Y");
float z = Input.GetAxis("Mouse ScrollWheel");//鼠标滚轮
if (z<0)//滚轮往前滑
{
if (Camera.main.fieldOfView<90)
{
Camera.main.fieldOfView += 2;//画面放大
}
}
if (z>0)//滚轮往后滑
{
if (Camera.main.fieldOfView >30)
{
Camera.main.fieldOfView -= 2;//画面缩小
}
}
if (Input.GetMouseButton(1))
{
//相机的移动速度
cameraRoation.x -= y * speed;
cameraRoation.y += x * speed;
//相机的抬头,低头限制
cameraRoation.x = Mathf.Clamp(cameraRoation.x, -30, 40);
//相机跟随鼠标事件的移动视角
transform.rotation = Quaternion.Euler(cameraRoation.x, cameraRoation.y, 0);
//玩家跟着相机的y轴转向移动而移动
player.transform.rotation = Quaternion.Euler(0, cameraRoation.y, 0);
}
else
{
}
}