Unity鼠标控制摄像机拖拽、旋转、缩放(模拟编辑器摄像机功能)

网上有不少类似内容了,不过有些不全面,甚至有有残缺,少了上下文,导致复制代码以后报错,笔者很讨厌这种太监代码!!

话说真传一句话,假传万卷书,代码全文如下:复制到自己脚本中,挂到摄像机上即可运行

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

public class CameraControl : MonoBehaviour
{
    [Tooltip("code auto get")]
    [SerializeField]
    private Camera mainCamera;
    private Transform cameraTrans;

    private int xAxisCoefficient = 1;
    private int yAsixCoefficient = 1;

    private string _mouseXString = "Mouse X";
    private string _mouseYString = "Mouse Y";
    private string _mouseScrollWheel = "Mouse ScrollWheel";
    private Vector3 _currentMouseRotate = Vector3.zero;

    public float fieldOfViewMin = 20.0f;
    public float fieldOfviewMax = 100.0f;
    public float moveSpeed = 3;
    public float sensitivityDrag = 1;
    public float sensitivityRotate = 3;
    public float sensitivetyMouseWheel = 30;

    #region 面板修改该选项后要重新启动
    public bool xAxisinversion = false;
    public bool yAsixinversion = false;
    #endregion

    private void Start()
    {
        mainCamera = gameObject.GetComponent<Camera>();
        if (mainCamera == null)
        {
            Debug.LogErrorFormat("摄像机为空!");
            return;
        }
        cameraTrans = mainCamera.transform;

        xAxisCoefficient = xAxisinversion ? -1 : 1;
        yAsixCoefficient = yAsixinversion ? -1 : 1;
    }

    private void Update()
    {
        if (cameraTrans == null) return;

        KeyBoardControl();

        MouseLeftDragControl();

        MouseRightRotateControl();

        MouseScrollwheelScale();
    }

    /// <summary>
    /// 键盘移动
    /// </summary>
    private void KeyBoardControl()
    {
        if (Input.GetKey(KeyCode.W))
        {
            cameraTrans.Translate(Vector3.forward * Time.deltaTime * moveSpeed);
        }

        if (Input.GetKey(KeyCode.S))
        {
            cameraTrans.Translate(Vector3.back * Time.deltaTime * moveSpeed);
        }

        if (Input.GetKey(KeyCode.A))
        {
            cameraTrans.Translate(Vector3.left * Time.deltaTime * moveSpeed);
        }

        if (Input.GetKey(KeyCode.D))
        {
            cameraTrans.Translate(Vector3.right * Time.deltaTime * moveSpeed);
        }
    }

    /// <summary>
    /// 鼠标左键拖拽摄像机
    /// </summary>
    private void MouseLeftDragControl()
    {
        if (Input.GetMouseButton(0))
        {
            Vector3 p1 = cameraTrans.position - cameraTrans.right * Input.GetAxisRaw(_mouseXString) * sensitivityDrag * Time.timeScale;
            Vector3 p2 = p1 - cameraTrans.up * Input.GetAxisRaw(_mouseYString) * sensitivityDrag * Time.timeScale;
            cameraTrans.position = p2;
        }
    }

    /// <summary>
    /// 鼠标右键旋转
    /// </summary>
    private void MouseRightRotateControl()
    {
        if (Input.GetMouseButton(1))
        {
            _currentMouseRotate.x = (Input.GetAxis(_mouseYString) * sensitivityRotate) * xAxisCoefficient;
            _currentMouseRotate.y = (Input.GetAxis(_mouseXString) * sensitivityRotate) * yAsixCoefficient;

            cameraTrans.rotation = Quaternion.Euler(cameraTrans.eulerAngles + _currentMouseRotate);
        }
    }

    /// <summary>
    /// 鼠标滚轮缩放
    /// </summary>
    private void MouseScrollwheelScale()
    {
        if (Input.GetAxis(_mouseScrollWheel) == 0) return;

        mainCamera.fieldOfView = mainCamera.fieldOfView - Input.GetAxis(_mouseScrollWheel) * sensitivetyMouseWheel;
        mainCamera.fieldOfView = Mathf.Clamp(mainCamera.fieldOfView, fieldOfViewMin, fieldOfviewMax);
    }
}

如果对你有帮助,非常荣幸!

  • 28
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 19
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值