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参数来限制视平面的拉近拉远距离.

### 回答1: Unity 是一种用于开发 3D 和 2D 游戏以及应用程序的跨平台游戏引擎。在 Unity 中,可以轻松地实现自由观察物体的功能。自由观察物体可以让用户自由地控制视角,使其可以自由地旋转平移缩放对象。这个功能在游戏中非常常用,比如在第一人称射击游戏中,玩家可以控制视角来寻找隐藏在角落里的敌人或者收集物品。 在 Unity 中,可以通过添加脚本来启用自由观察功能。在脚本中,可以定义相机的位置、旋转缩放,以及设定观察的目标物体。然后,将脚本附加到相机上即可。此外,Unity 还提供了许多内置的脚本和组件,可以帮助开发者更方便地实现自由观察功能。 自由观察物体的实现方法有很多种。最简单的方法是使用鼠标移动相机,这可以通过获取鼠标的位置和移动向量来实现。另一种方法是使用触摸屏幕,这可以通过获取触摸的位置和移动向量来实现。还有一种方法是使用键盘和游戏手柄,这可以通过监听输入事件来实现。 总之,自由观察物体是 Unity 中非常重要的功能之一。它可以帮助开发者更好地控制游戏对象的视角,从而提高游戏的玩法和用户体验。 ### 回答2: Unity 自由观察物体是指在Unity中,我们可以通过调整视角,以自己想要的角度来观察场景中的物体。这种操作方式非常直观且方便,能够帮助开发者更好地把握游戏场景中物体的位置、大小、旋转等信息。在Unity中,自由观察物体需要使用场景视图中的相机工具,通过拖动鼠标或使用快捷键来调整相机视角,从而实现自由观察。此外,Unity中还可以通过预设视图、相机跟随等方式来帮助开发者更好地观察游戏中的物体。在游戏开发过程中,自由观察物体可以帮助开发者更好地了解游戏场景中物体之间的关系,为游戏的制作提供更好的工具支持。总之,Unity 自由观察物体是一个非常实用的功能,能够提高开发效率,减少开发难度,帮助开发者更好地创造出优秀的游戏作品。 ### 回答3: Unity是一款非常流行的游戏开发引擎,它拥有强大的编辑器和丰富的工具集,可以帮助开发者轻松创建出高质量的游戏和应用。其中,自由观察物体是Unity的一个非常好用的功能。 自由观察物体指的是在场景中选中一个物体后,可以自由的旋转平移缩放和移动该物体,实时查看其不同角度和位置下的效果。这个功能对于开发者来说非常有帮助,因为它可以帮助他们更好地设计和调整场景中的物体位置和布局。 使用自由观察物体功能非常简单,只需要在编辑器中选中需要观察的物体,然后点击编辑器中的场景视图,即可进入自由观察模式。在模式下,可以使用鼠标左键进行旋转,右键进行平移,滚轮进行缩放,来观察目标物体。还可以使用快捷键进行切换视图模式、锁定轴向等操作,以便更好地完成任务。 总的来说,自由观察物体是Unity非常实用的一个工具,它可以帮助开发者更好地设计和调整游戏场景,提高开发效率,实现更好的游戏体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值