Unity场景漫游

using UnityEngine;

/// <summary>
/// 漫游类
/// </summary>
public class Roam : MonoBehaviour
{
    //[SerializeField]:将私有变量显示在Inspector视图上

    /// <summary>
    /// 鼠标移动速度
    /// </summary>
    [SerializeField] private float mouseMoveSpee;

    /// <summary>
    /// 移动速度
    /// </summary>
    [SerializeField] private float moveSpeed;

    /// <summary>
    /// 旋转速度
    /// </summary>
    [SerializeField] private float rotateSpeed;

    /// <summary>
    /// 缩放速度
    /// </summary>
    [SerializeField] private float zoomSpeed;


    /// <summary>
    /// 如果MonoBehaviour已启用,则在每一帧都调用Update
    /// </summary>
    private void Update()
    {
        //鼠标控制移动
        MouseControlMove();

        //键盘控制移动
        KeyBoardControlMove();

        //鼠标控制旋转
        MouseControlRotate();

        //鼠标控制缩放
        MouseControlZoom();
    }

    /// <summary>
    /// 功能:键盘移动
    /// 操作:按下鼠标右键+WSADEQ
    /// 介绍:WSADEQ分别对应前后左右上下
    /// </summary>
    private void KeyBoardControlMove()
    {
        /*
         * 判断鼠标右键是否持续按钮
         * 获取鼠标右键按下3种方式:
         *  1、Input.GetMouseButton(1)
         *  2、Input.GetButton("Fire2")
         *  3、Input.GetKey(KeyCode.Mouse1)
         */
        if (Input.GetMouseButton(1))
        {
            /*
             * 功能:获取键盘上下移动
             * 介绍:A键或左方向键控制向左,D键或右方向键控制向右
             * 注意:这个是Unity内置的,可在Edit -> Project Settings -> Input下修改
             */
            float horizontal = Input.GetAxisRaw("Horizontal");

            /*
             * 功能:获取键盘上下移动
             * 介绍:W键或上方向键控制向前,S键或下方向键控制向后
             * 注意:这个是Unity内置的,可在Edit -> Project Settings -> Input下修改
             */
            float vertical = Input.GetAxisRaw("Vertical");

            /*
             * 功能:获取键盘上下移动
             * 介绍:E键控制向上,Q键控制向下
             * 注意:这个是自定义的,可在Edit -> Project Settings -> Input下修改
             */
            float upOrDown = Input.GetAxisRaw("UpOrDown");

            //移动方向
            Vector3 increment = new Vector3(horizontal, upOrDown, vertical);

            /*
             * 开始移动
             * increment:方向
             * moveSpeed:速度
             * Time.deltaTime:每秒移动多少
             */
            transform.Translate(increment * moveSpeed * Time.deltaTime);
        }
    }

    /// <summary>
    /// 功能:鼠标控制旋转
    /// 操作:持续按下鼠标右键滑动
    /// </summary>
    private void MouseControlRotate()
    {
        //判断鼠标右键持续按下
        if (Input.GetMouseButton(1))
        {
            //获取鼠标水平移动
            float mouseX = Input.GetAxisRaw("Mouse X");

            //获取鼠标垂直移动
            float mouseY = Input.GetAxisRaw("Mouse Y");

            //旋转方向
            Vector3 increment = new Vector3(-mouseY, mouseX, 0);

            /*
             * 开始旋转
             * increment:旋转方向
             * rotateSpeed:旋转速度
             * Time.deltaTime:每秒旋转多少度
             * 此方法可以解决万向锁现象
             */
            transform.localEulerAngles += increment * rotateSpeed * Time.deltaTime;
        }
    }

    /// <summary>
    /// 功能:鼠标控制缩放
    /// 操作:滑动鼠标滚轮
    /// </summary>
    private void MouseControlZoom()
    {
        //获取向前还是向后滑动
        float mouseScrollWheel = Input.GetAxisRaw("Mouse ScrollWheel");

        //缩放方向
        Vector3 increment = new Vector3(0, 0, mouseScrollWheel);

        /*
         * increment:滑动方向
         * zoomSpeed:滑动速度
         * Time.deltaTime:每秒滑动多少米
         */
        transform.Translate(increment * zoomSpeed * Time.deltaTime);
    }
    
    /// <summary>
    /// Q键状态
    /// </summary>
    bool isQDown;

    /// <summary>
    /// 鼠标控制移动
    /// </summary>
    private void MouseControlMove()
    {
        //判断Q键是否按下
        if (Input.GetKeyDown(KeyCode.Q))
        {
            //判断Q键状态是否为没按下
            if (!isQDown)
            {
                //Q键状态改成按下
                isQDown = true;
            }
            else
            {
                //Q键状态改成未按下
                isQDown = false;
            }
        }

        //判断鼠标左键是否持续按下并且Q键状态为按下
        if (Input.GetMouseButton(0) && isQDown)
        {
            //获取鼠标水平移动
            float mouseX = Input.GetAxisRaw("Mouse X");

            //获取鼠标垂直移动
            float mouseY = Input.GetAxisRaw("Mouse Y");

            //获取移动方向
            Vector3 increment = new Vector3(mouseX, mouseY, 0);

            /*
             * 开始移动
             * increment:移动方向
             * mouseMoveSpee:移动速度
             * Time.deltaTime:每秒移动多少米
             */
            transform.Translate(increment * mouseMoveSpee * Time.deltaTime);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq10198145/article/details/81807951