摄像机跟随之第一人称视角

本篇讲的是第一人称视角摄像机的跟随,在这里我们讲两种方法,第一种是,用别人的插件,第二种是自己写脚本。
一.插件或者已经写好的脚本
在官方的资源包里面有一个第一人称的预制体,非常实用。

这里写图片描述

直接把预制体拖到场景里即可,运行。关于官方脚本的解析,后期还会做相关的文章解析。
二.自己写脚本
脚本一:不能控制上下仰角,新建脚本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;
    }
}

控制角度的时候我使用的是一种获取角度的方法,就是摄像机向前的角度始终有一根射线,当俯视时,会碰到地面,此时获取摄像机向前与主角向前的度数,将角度数取负数,判断大小
这里写图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ToDoNothing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值