Unity通过相机旋转和缩放物体
1.首先新建一个空物体命名为“CameraController”
2.在“CameraController”对象下,创建一个名为“CameraObject”的空对象
3.将“Main Camera”拖动到“CameraObject”对象层级下
4.新建一个“Cube”物体
5.在“CameraController”对象上,创建一个名字为“RotateZoomObject”的C#脚本;(代码如下)
using System;
using UnityEngine;
[Serializable]
public struct CameraParameter
{
public bool limitXAngle;
public float minXAngle;
public float maxXAngle;
public bool limitYAngle;
public float minYAngle;
public float maxYAngle;
public float orbitSensitive;
public float mouseMoveRatio;
}
/// <summary>旋转和缩放物体</summary>
public class RotateZoomObject : MonoBehaviour
{
#region 数据申明
private Vector3 lastMousePos;
private Vector3 targetEulerAngle;
private Vector3 eulerAngle;
public CameraParameter limitRotationAngle;
private CameraParameter cureentCameraParameter;
public Transform cameraRoot;
public Transform cameraTf;
private float cameraDistance;
private float targetCameraDistance;
private float lastTouchDistance;
public float minDistance = 5f;
public float maxDistance = 30f;
public float mouseScroollRatio = 1f;
public float zoomSensitive = 1f;
private Quaternion originalRotate;
#endregion
#region Unity函数
private void Start()
{
originalRotate = cameraRoot.rotation;
cameraDistance = cameraTf.localPosition.z;
targetCameraDistance = cameraDistance;
cureentCameraParameter = limitRotationAngle;
}
private void Update()
{
Rotate();
Zoom();
}
#endregion
#region 私有函数
private void Rotate()
{
if (Input.GetMouseButtonDown(0))
{
lastMousePos = Input.mousePosition;
}
if (Input.GetMouseButton(0))
{
targetEulerAngle.x += (-Input.mousePosition.y + lastMousePos.y) * cureentCameraParameter.mouseMoveRatio;
targetEulerAngle.y += (Input.mousePosition.x - lastMousePos.x) * cureentCameraParameter.mouseMoveRatio;
if (cureentCameraParameter.limitXAngle)
{
targetEulerAngle.x = Mathf.Clamp(targetEulerAngle.x, cureentCameraParameter.minXAngle,
cureentCameraParameter.maxXAngle);
}
if (cureentCameraParameter.limitYAngle)
{
targetEulerAngle.y = Mathf.Clamp(targetEulerAngle.y, cureentCameraParameter.minYAngle,
cureentCameraParameter.maxXAngle);
}
lastMousePos = Input.mousePosition;
}
if (Input.touchCount < 2)
{
eulerAngle = Vector3.Lerp(eulerAngle, targetEulerAngle,
Time.fixedDeltaTime * cureentCameraParameter.orbitSensitive);
cameraRoot.rotation = originalRotate * Quaternion.Euler(eulerAngle);
}
}
private void Zoom()
{
if (Input.touchCount < 2)
{
if (Input.GetAxis("Mouse ScrollWheel") != 0)
{
cameraDistance = -cameraTf.localPosition.z;
targetCameraDistance = cameraDistance -
Input.GetAxis("Mouse ScrollWheel") * cameraDistance * mouseScroollRatio;
targetCameraDistance = Mathf.Clamp(targetCameraDistance, minDistance, maxDistance);
}
}
else
{
if (Input.GetTouch(1).phase == TouchPhase.Began)
{
lastTouchDistance = Vector2.Distance(Input.GetTouch(0).position, Input.GetTouch(1).position);
}
if (Input.GetTouch(1).phase == TouchPhase.Moved || Input.GetTouch(0).phase == TouchPhase.Moved)
{
cameraDistance = -cameraTf.localPosition.z;
targetCameraDistance = cameraDistance -
(Vector2.Distance(Input.GetTouch(0).position, Input.GetTouch(1).position) -
lastTouchDistance) * mouseScroollRatio;
lastMousePos = Input.mousePosition;
}
}
if (Mathf.Abs(targetCameraDistance - cameraDistance) > 0.1f)
{
cameraDistance = Mathf.Lerp(cameraDistance, targetCameraDistance, Time.fixedDeltaTime * zoomSensitive);
cameraTf.localPosition = new Vector3(cameraTf.localPosition.x, cameraTf.localPosition.y, -cameraDistance);
}
}
#endregion
}
6.将 “cameraRoot”属性赋值为“CameraController”对象,“cameraTf”属性赋值为“CameraObject”对象
7.设置旋转的灵敏度;(“orbitSensitive”是移动端灵敏度,“mouseMoveRatio”是鼠标灵敏度)
8.如果需要限制垂直轴旋转角度,请将“limitXAngle”属性勾选,并且设置最大旋转角度,和最小旋转角度
9.如果需要限制水平轴旋转角度,请将“limitYAngle”属性勾选,并且设置最大旋转角度,和最小旋转角度
10.根据自己需求设置缩放的最大距离,和最小距离
11.设置缩放灵敏度
Unity QQ交流群:299412191 欢迎对Unity感兴趣的同学加入.
源文件下载链接: https://pan.baidu.com/s/1uuIdN6LobnU7uQFd6TIgZQ 提取码: ckjt