其他分享
首页 > 其他分享> > Unity 基础 之 鼠标控制 相机(摄像机Camera)的旋转,移动和 fov 的简单使用整理

Unity 基础 之 鼠标控制 相机(摄像机Camera)的旋转,移动和 fov 的简单使用整理

作者:互联网

 

Unity 基础 之 鼠标控制 相机(摄像机Camera)的旋转,移动和 fov 的简单使用整理

 

目录

Unity 基础 之 鼠标控制 相机(摄像机Camera)的旋转,移动和 fov 的简单使用整理

一、简单介绍

二、实现原理

三、使用注意

四、效果预览

五、实现步骤

六、关键代码


 

一、简单介绍

Unity中的一些基础知识点。

本节介绍,在Unity 应用的时候,使用鼠标控制玩家Camera 的旋转移动和 视角fov 的功能,在这里简单做个整理,方便后期使用,如果能帮到您,那就太好了。

 

二、实现原理

1、Input.GetAxis("Mouse X") 和 Input.GetAxis("Mouse Y") 获取鼠标的移动信息,对应进行角度和移动数据转换,然后赋值到相机上

2、Input.GetAxis("Mouse ScrollWheel") 获取鼠标滚轮的信息,对应进行角度和移动数据转换,然后赋值到相机上

 

三、使用注意

1、这里只是抛砖引玉的作用,大家可以根据自己的需要,获取自己需要的鼠标数据进行其他拓展,其实第一人称游戏大概就会摸索出一些感觉来了

 

四、效果预览

 

五、实现步骤

1、打开Unity,新建一个空工程

 

2、简单的摆设一下场景,便于演示使用

 

3、新建一个脚本实现 鼠标控制 camera 的移动旋转和 fov 变化的功能

 

4、把脚本挂载到场景的 MainCamera 上

 

5、运行场景,既可以有控制效果

 

六、关键代码

1、MouseOperationCameraRotationFovMove

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MouseOperationCameraRotationFovMove : MonoBehaviour
{
    public enum MouseState { 
        None,
        MidMouseBtn,
        LeftMouseBtn
    }



    private MouseState mMouseState = MouseState.None;
    private Camera mCamera;


    private void Awake()
    {
        mCamera = GetComponent<Camera>();
        if (mCamera==null)
        {
            Debug.LogError(GetType()+"camera Get Error ……");
        }

        GetDefaultFov();
    }

    private void LateUpdate()
    {
        CameraRotate();

        CameraFOV();

        CameraMove();
    }

    #region Camera Rotation

    //旋转最大角度
    public int yRotationMinLimit = -20;
    public int yRotationMaxLimit = 80;
    //旋转速度
    public float xRotationSpeed = 250.0f;
    public float yRotationSpeed = 120.0f;
    //旋转角度
    private float xRotation = 0.0f;
    private float yRotation = 0.0f;

    /// <summary>
    /// 鼠标移动进行旋转
    /// </summary>
    void CameraRotate()
    {
        if (mMouseState == MouseState.None)
        {
           
            //Input.GetAxis("MouseX")获取鼠标移动的X轴的距离
            xRotation -= Input.GetAxis("Mouse X") * xRotationSpeed * 0.02f;
            yRotation += Input.GetAxis("Mouse Y") * yRotationSpeed * 0.02f;

            yRotation = ClampValue(yRotation, yRotationMinLimit, yRotationMaxLimit);//这个函数在结尾
                                                    //欧拉角转化为四元数
            Quaternion rotation = Quaternion.Euler(-yRotation, -xRotation, 0);
            transform.rotation = rotation;

        }
    }

    #endregion

    #region Camera fov

    //fov 最大最小角度
    public int fovMinLimit = 25;
    public int fovMaxLimit = 75;
    //fov 变化速度
    public float fovSpeed = 50.0f;
    //fov 角度
    private float fov = 0.0f;

    void GetDefaultFov() {
        fov = mCamera.fieldOfView;
    }

    /// <summary>
    /// 滚轮控制相机视角缩放
    /// </summary>
    public void CameraFOV()
    {
        //获取鼠标滚轮的滑动量
        fov += Input.GetAxis("Mouse ScrollWheel") * Time.deltaTime * 100 * fovSpeed;

        // fov 限制修正
        fov = ClampValue(fov,fovMinLimit, fovMaxLimit);

        //改变相机的 fov
        mCamera.fieldOfView = (fov);
    }

    #endregion


    #region Camera Move

    float _mouseX = 0;
    float _mouseY = 0;
    public float moveSpeed = 1;
    /// <summary>
    /// 中键控制拖动
    /// </summary>
    public void CameraMove()
    {
        if (Input.GetMouseButton(2))
        {
            _mouseX = Input.GetAxis("Mouse X");
            _mouseY = Input.GetAxis("Mouse Y");

            //相机位置的偏移量(Vector3类型,实现原理是:向量的加法)
            Vector3 moveDir = (_mouseX * - transform.right + _mouseY * - transform.forward);

            //限制y轴的偏移量
            moveDir.y = 0;
            transform.position += moveDir * 0.5f * moveSpeed;
        }
        else if (Input.GetMouseButtonDown(2))
        {
            mMouseState = MouseState.MidMouseBtn;
            Debug.Log(GetType() + "mMouseState = " + mMouseState.ToString());
        }
        else if (Input.GetMouseButtonUp(2))
        {
            mMouseState = MouseState.None;
            Debug.Log(GetType() + "mMouseState = " + mMouseState.ToString()); 
        }
       
    }

    #endregion

    #region tools ClampValue

    //值范围值限定
    float ClampValue(float value, float min, float max)//控制旋转的角度
    {
        if (value < -360)
            value += 360;
        if (value > 360)
            value -= 360;
        return Mathf.Clamp(value, min, max);//限制value的值在min和max之间, 如果value小于min,返回min。 如果value大于max,返回max,否则返回value
    }


    #endregion
}

 

标签:fov,鼠标,float,value,Unity,Camera,Input,public
来源: https://blog.csdn.net/u014361280/article/details/113689370