Unity相机观察器(实现控制视角旋转,平移,缩放)

相机观察器

网上找了许多视角控制的方法,但都不满意,达不到我预期的效果,于是总结一些方法自己写了一个。
仿Unity的Scene里的视角操作模式,实现控制视角旋转,平移,缩放。对其做了一些限制,即限制了X方向上的角度避免翻转过头,可选择设置限制目标物体来限制视平面的拉近拉远距离.

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

/// <summary>
/// 相机观察器
/// </summary>
public class CameraViewer : MonoBehaviour
{
    //距离限制目标物体,可不设置,即不限制视角拉近拉远的最小最大值
    [SerializeField]
    Transform limitTarget;

    [SerializeField]
    float
             //视角旋转敏感度
             rotateFactor = 2,
             //视角平移敏感度
             translationFactor = 0.1f,
             //视角拉近拉远敏感度
             zoomFactor = 1,
             //限制视平面距离目标最小值
             limitMinDistance = 1f,
             //限制视平面距离目标最大值
             limitMaxDistance = 10f,
             //X角度限制
             xLimit = 60;

    void Update()
    {
        //按下右键拖拽,视角旋转
        if (Input.GetMouseButton(1))
        {
            var dx = Input.GetAxis("Mouse X") * rotateFactor;
            var dy = Input.GetAxis("Mouse Y") * rotateFactor;

            if (Mathf.Abs(dx) > 0 || Mathf.Abs(dy) > 0)
            {
                Vector3 angles = transform.rotation.eulerAngles;
                angles.y += dx;

                angles.x = Mathf.Repeat(angles.x + 180f, 360f) - 180f;
                angles.x -= dy;
                angles.x = ClampAngle(angles.x, -xLimit, xLimit);
  
                Quaternion targetRotation = default;
                targetRotation.eulerAngles = new Vector3(angles.x, angles.y, 0);
                transform.rotation = targetRotation;

            }
        }
        //按下滚轮拖拽,视角平移
        else if (Input.GetMouseButton(2))
        {
            float x = Input.GetAxis("Mouse X");
            float y = Input.GetAxis("Mouse Y");
            var tv = new Vector3(-x, -y) * translationFactor;
            transform.Translate(tv);
        }
        //滚动滚轮,视角拉近拉远
        else if (Input.GetAxis("Mouse ScrollWheel") != 0)
        {
            var sv = Input.GetAxis("Mouse ScrollWheel") * zoomFactor;
            var backupPos = transform.position;

            transform.Translate(0, 0, sv);

            if (limitTarget != null)
            {
                var d = new Plane(transform.forward, transform.position).GetDistanceToPoint(limitTarget.position);
                if ((d > limitMaxDistance && sv < 0) || (d < limitMinDistance && sv > 0))
                {
                    transform.position = backupPos;
                }
            }

        }

    }

    // 控制角度范围
    float ClampAngle(float angle, float min, float max)
    {
        if (angle < -360f) angle += 360f;
        else if (angle > 360f) angle -= 360f;

        return Mathf.Clamp(angle, min, max);
    }
}

使用方法:
挂载到MainCamera上即可,可选择设置limitTarget参数来限制视平面的拉近拉远距离.

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值