之前接过一个需求,是有两个3D物体的展示,展示的时候只有鼠标可以对其进行操作。需求是:
- 鼠标左键拖动的时候控制视角围绕两个物体中心进行旋转;
- 鼠标右键拖动的时候控制视角上下旋转;
- 鼠标滚轮键滚动的时候控制视角的拉近拉远;
- 鼠标滚轮键按下的时候对视角进行上下移动;
使用时将该脚本挂载在摄像机物体上即可,代码如下,
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
}