先看一下功能效果
首先导入插件RuntimeGizmo
将TransformGizmo脚本挂载相机上,可以实现点击物体移动、缩放和旋转。
在此基础上还需实现右键旋转视角,滚轮控制视角移动以及视角缩放功能。
新建CameraController脚本,也挂载在主相机上。
using UnityEngine;
public class CameraController : MonoBehaviour
{
/// <summary>
/// 主相机
/// </summary>
private Camera camera;
/// <summary>
/// 视角旋转速度
/// </summary>
private float rotateSpeed = 0.1f;
/// <summary>
/// 视角移动灵敏度
/// </summary>
private float sensitivity = 5f;
/// <summary>
/// 鼠标上一帧位置
/// </summary>
private Vector3 lastPos = Vector3.zero;
private void Start()
{
camera = GetComponent<Camera>();
}
void Update()
{
if (Input.GetMouseButtonDown(1) || Input.GetMouseButtonDown(2))
{
lastPos = Input.mousePosition;
}
if (Input.GetMouseButton(1))//鼠标右键按下 旋转摄影机
{
RotateCamera();
}
if (Input.GetMouseButton(2))//滚轮按下拖拽视角
{
DragCamera();
}
MoveCamera();//视角放近放远
}
/// <summary>
/// 相机前后移动
/// </summary>
private void MoveCamera()
{
float mouse = Input.GetAxis("Mouse ScrollWheel");
Vector3 distance = transform.forward * mouse * 10f;
transform.position += distance;
}
/// <summary>
/// 相机旋转
/// </summary>
private void RotateCamera()
{
float dx = Input.mousePosition.x - lastPos.x;
float dy = Input.mousePosition.y - lastPos.y;
Vector3 rotation = transform.rotation.eulerAngles;
rotation.x -= dy * rotateSpeed;
rotation.y += dx * rotateSpeed;
transform.rotation = Quaternion.Euler(rotation);
lastPos = Input.mousePosition;
}
/// <summary>
/// 相机平移
/// </summary>
private void DragCamera()
{
Vector3 delta = lastPos - Input.mousePosition;
float sq = Mathf.Sqrt(camera.pixelHeight * camera.pixelHeight + camera.pixelWidth * camera.pixelWidth);
delta = delta / sq;
delta *= sensitivity;
delta = camera.cameraToWorldMatrix.MultiplyVector(delta);
camera.transform.position += delta;
lastPos = Input.mousePosition;
}
}