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

发布了2 篇原创文章 · 获赞 3 · 访问量 193

猜你喜欢

转载自blog.csdn.net/a451319296/article/details/103942128
今日推荐