本篇讲的是第一人称视角摄像机的跟随,在这里我们讲两种方法,第一种是,用别人的插件,第二种是自己写脚本。
一.插件或者已经写好的脚本
在官方的资源包里面有一个第一人称的预制体,非常实用。
直接把预制体拖到场景里即可,运行。关于官方脚本的解析,后期还会做相关的文章解析。
二.自己写脚本
脚本一:不能控制上下仰角,新建脚本Player,
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour {
private Camera m_camera;
public float cameraheight;
private Vector3 CameraRotAngle;
private Vector3 PlayerRotAngle;
void Start () {
m_camera = Camera.main.GetComponent<Camera>();
Vector3 pos = transform.position;
cameraheight = cameraheight + pos.y;
pos.y = cameraheight;
m_camera.transform.position = pos;
}
// Update is called once per frame
void Update () {
}
private void FixedUpdate()
{
RotCamera();
}
private void RotCamera()
{
float MouseX = Input.GetAxis("Mouse X");
float MouseY = Input.GetAxis("Mouse Y");
CameraRotAngle.x -= MouseY;
CameraRotAngle.y += MouseX;
m_camera.transform.eulerAngles = CameraRotAngle;
PlayerRotAngle = m_camera.transform.eulerAngles;
PlayerRotAngle.x = 0;
PlayerRotAngle.z = 0;
transform.eulerAngles = PlayerRotAngle;
}
}
在场景中新建一个空物体,取名Player,然后把脚本挂上去,当然移动的脚本这里我省略了,再下面一个脚本有相关的代码。
脚本二:能控制仰角和俯角
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraFollower : MonoBehaviour {
private Camera m_Camera;//摄像机
private float StartCameraPosHeight;//相机初始化位置
public float RotateSpeed=3f;//鼠标移动时镜头移动速度
public float MoveSpeed;//移动速度
Vector3 RelPos;//相对位置
private float Minangle;//俯角的最小角度
private float Maxangle=80;//仰角的最大角度
RaycastHit hit;
void Start () {
Vector3 pos = transform.position;
StartCameraPosHeight = StartCameraPosHeight + pos.y;
pos.y = StartCameraPosHeight;
m_Camera = Camera.main;
m_Camera.transform.position = pos;
RelPos = transform.position - m_Camera.transform.position;//获取相对位置
}
void Update () {
}
private void FixedUpdate()
{
RotateCamera();//旋转脚本
MoveMent();//移动脚本
}
private void RotateCamera()
{
float MouseX = Input.GetAxis("Mouse X")*RotateSpeed*Time.deltaTime;
float MouseY = Input.GetAxis("Mouse Y")*RotateSpeed*Time.deltaTime;
float angle = Vector3.Angle(transform.forward, m_Camera.transform.forward);
print(angle);
if (Physics.Raycast(m_Camera.transform.position, m_Camera.transform.forward,out hit,10))//射线判断角度
{
Minangle = -angle;
if (Minangle < -60 && MouseY < 0)
{
MouseY = 0;//使之不能旋转即可
}
Debug.DrawLine(m_Camera.transform.position, hit.point, Color.red);//测试用的
}
if (angle > Maxangle && MouseY > 0)
{
MouseY = 0;
}
m_Camera.transform.Rotate(Vector3.up, MouseX,Space.World);
transform.Rotate(Vector3.up, MouseX, Space.World);//主角也跟着摄像机旋转角度
m_Camera.transform.Rotate(Vector3.right, -MouseY,Space.Self);
}
private void MoveMent()
{
float h = Input.GetAxis("Horizontal")*MoveSpeed*Time.deltaTime;
float v = Input.GetAxis("Vertical")*MoveSpeed*Time.deltaTime;
transform.Translate(new Vector3(h, 0, v));
m_Camera.transform.position = transform.position - RelPos;
}
}
控制角度的时候我使用的是一种获取角度的方法,就是摄像机向前的角度始终有一根射线,当俯视时,会碰到地面,此时获取摄像机向前与主角向前的度数,将角度数取负数,判断大小