之前接过一个需求,是有两个3D物体的展示,展示的时候只有鼠标可以对其进行操作。需求是:

  1. 鼠标左键拖动的时候控制视角围绕两个物体中心进行旋转;
  2. 鼠标右键拖动的时候控制视角上下旋转;
  3. 鼠标滚轮键滚动的时候控制视角的拉近拉远;
  4. 鼠标滚轮键按下的时候对视角进行上下移动;

使用时将该脚本挂载在摄像机物体上即可,代码如下,


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

/// <summary>
///  控制物体视角
///  鼠标左键拖动控制视角围绕中心店旋转
///  鼠标右键拖动控制视角上下旋转
///  鼠标滚轮键滚动控制视角拉近拉远
///  鼠标滚轮键按下移动摄像机上下左右移动
///  该脚本挂载在摄像机物体上
/// </summary>
public class ViewControllerScript : MonoBehaviour
{
    #region 变量属性
    /// <summary>
    ///  第一个物体
    /// </summary>
    public Transform startPosition;

    /// <summary>
    ///  第二个物体
    /// </summary>
    public Transform endPosition;

    /// <summary>
    ///  起点到终点距离的百分比
    /// </summary>
    public float percentValue;

    /// <summary>
    ///  鼠标左键旋转速度
    /// </summary>
    public float rotateSpeed;

    /// <summary>
    ///  鼠标上下移动速度
    /// </summary>
    public float moveSpeed;

    /// <summary>
    ///  定义摄像机的最小焦距
    /// </summary>
    public float minDistance = 15;

    /// <summary>
    ///  定义摄像机的最大焦距
    /// </summary>
    public float maxDistance = 90;

    /// <summary>
    ///  视角拉近拉远速度
    /// </summary>
    public float scrollWheelSpeed = 5;
    /// <summary>
    ///  所有被观察物体的中心点
    /// </summary>
    private Vector3 centerPosition;

    /// <summary>
    ///  摄像机组件
    /// </summary>
    private Camera cameraComponent;

    /// <summary>
    ///  水平轴的变化值
    /// </summary>
    private float mouseXValue;

    /// <summary>
    ///  竖直轴的变化值
    /// </summary>
    private float mouseYValue;

    private float hor;
    private float ver;

    public GameObject game;
    #endregion

    #region Unity回调



    private void Awake()
    {
        // 初始化摄像机组件
        cameraComponent = transform.GetComponent<Camera>();
        // 计算出物体之间的中心点
        centerPosition = GetBeTweenPoint(startPosition.position, endPosition.position, percentValue);
        game.transform.position = centerPosition;
        Debug.Log(centerPosition);
    }

    private void Update()
    {
        
        // 控制摄像机焦距发生变化
        ScrollWheelController(minDistance, maxDistance);

        if (Input.GetMouseButton(0))
        {
            //Debug.Log("按下了鼠标左键");
            RotateAroundCamera();
            RotateCamera();
        }

        if (Input.GetMouseButton(1))
        {
            Debug.Log("按下了鼠标右键");
            
        }

        if (Input.GetMouseButton(2))
        {
            Debug.Log("按下了鼠标中键");
            MoveCamera();
        }
        
    }

    #endregion

    #region 控制方法
    /// <summary>
    ///  鼠标左键拖动控制视角围绕中心店旋转
    /// </summary>
    private void RotateAroundCamera()
    {
        // 鼠标X轴向移动
        mouseXValue = Input.GetAxis("Mouse X");
        if (mouseXValue != 0)
        {
            transform.RotateAround(
                centerPosition, Vector3.up * mouseXValue, Time.deltaTime * rotateSpeed);
        }
    }

    /// <summary>
    ///  鼠标右键拖动控制视角上下旋转
    /// </summary>
    private void RotateCamera()
    {
        // 鼠标Y轴向移动
        mouseYValue = Input.GetAxis("Mouse Y");
        // 如果鼠标Y轴不等于0
        if (mouseYValue != 0)
        {
             transform.Rotate(-Vector3.right * rotateSpeed * Time.deltaTime * mouseYValue);
        }
    }

    /// <summary>
    ///  按下滚轮键移动摄像机
    /// </summary>
    private void MoveCamera()
    {
        // 鼠标X轴向移动
        mouseXValue = Input.GetAxis("Mouse X");
        // 鼠标Y轴向移动
        mouseYValue = Input.GetAxis("Mouse Y");

        if (mouseXValue != 0)
        {
            transform.position -= transform.right * moveSpeed * Time.deltaTime * mouseXValue;
        }

        if (mouseYValue != 0)
        {
            transform.Translate(-Vector3.up * moveSpeed * Time.deltaTime * mouseYValue, Space.World);
        }
    }

    /// <summary>
    ///  鼠标滚轮控制摄像机视角
    /// </summary>
    /// <param name="minDis">摄像机的最小焦距</param>
    /// <param name="maxDis">摄像机的最大焦距</param>
    private void ScrollWheelController(float minDis,float maxDis)
    {
        transform.position += Input.GetAxis("Mouse ScrollWheel") * transform.forward * Time.deltaTime * scrollWheelSpeed;
    }

    /// <summary>
    ///  获取两个点之间距离一定百分比的一个点
    /// </summary>
    /// <param name="startPos">起点位置</param>
    /// <param name="endPos">终点位置</param>
    /// <param name="percent">起点到终点位置的百分比</param>
    /// <returns></returns>
    private Vector3 GetBeTweenPoint(Vector3 startPos, Vector3 endPos, float percent)
    {
        Vector3 normal = (endPos - startPos).normalized;
        float distance = Vector3.Distance(startPos, endPos);
        return normal * (distance * percent) + startPos;
    }
    #endregion

}