Unity 相机观察物体

分享一份摄像机观察物体的脚本,改脚本包含,环绕目标旋转,缩放,平移功能,做个记录.

using UnityEngine;

public class CameraObserve : MonoBehaviour
{
    public static CameraObserve Instance;

    /// <summary>
    /// 是否可以旋转
    /// </summary>
    public bool CanMove = false;

    /// <summary>
    /// 旋转目标
    /// </summary>
    public Transform Target;

    /// <summary>
    /// Mouse X速度
    /// </summary>
    public float XSpeed = 200;

    /// <summary>
    /// Mouse Y速度
    /// </summary>
    public float YSpeed = 200;

    /// <summary>
    /// Mouse ScrollWheel速度
    /// </summary>
    public float MSpeed = 10;

    /// <summary>
    /// Zoom速度
    /// </summary>
    public float ZSpeed = 0.04f;

    /// <summary>
    /// Y轴限制最小角度
    /// </summary>
    public float yMinLimit = -50;

    /// <summary>
    /// Y轴限制最大角度
    /// </summary>
    public float YMaxLimit = 50;

    /// <summary>
    /// 摄像机距离目标的距离
    /// </summary>
    public float CurrentDistance = 7;

    /// <summary>
    /// 限制最小距离
    /// </summary>
    public float MinDistance = 2;

    /// <summary>
    /// 限制最大距离
    /// </summary>
    public float MaxDistance = 30;

    /// <summary>
    /// 是否需要阻尼
    /// </summary>
    public bool IsDamping = true;

    /// <summary>
    /// 阻尼值
    /// </summary>
    public float Damping = 5.0f;

    /// <summary>
    /// 当前角度X
    /// </summary>
    private float CurrentAngleX = 0.0f;

    /// <summary>
    /// 当前角度Y
    /// </summary>
    private float CurrentAngleY = 0.0f;

    /// <summary>
    /// 当前位置X
    /// </summary>
    private float CurrentPosX = 0;

    /// <summary>
    /// 当前位置Y
    /// </summary>
    private float CurrentPosY = 0;

    /// <summary>
    /// 是否允许平移拖动
    /// </summary>
    public bool IsZoom = false;

    private void Awake()
    {
        Instance = this;
    }
    // Use this for initialization
    void Start()
    {
        InitNum();
    }

    /// <summary>
    /// 数值初始化
    /// </summary>
    private void InitNum()
    {
        Vector3 angles = transform.eulerAngles;
        CurrentAngleX = angles.y;
        CurrentAngleY = angles.x;

        CurrentPosX = transform.position.x;
        CurrentPosY = transform.position.y;
    }


    // Update is called once per frame
    void LateUpdate()
    {
        if (Target != null && CanMove)
        {
            if (Input.GetMouseButton(0))
            {
                CurrentAngleX += Input.GetAxis("Mouse X") * XSpeed * Time.deltaTime;
                CurrentAngleY -= Input.GetAxis("Mouse Y") * YSpeed * Time.deltaTime;

                CurrentAngleY = ClampAngle(CurrentAngleY, yMinLimit, YMaxLimit);
            }

            if (Input.GetMouseButton(2) && IsZoom)
            {
                CurrentPosX -= Input.GetAxis("Mouse X") * ZSpeed;
                CurrentPosY -= Input.GetAxis("Mouse Y") * ZSpeed;
            }

            CurrentDistance -= Input.GetAxis("Mouse ScrollWheel") * MSpeed;
            CurrentDistance = Mathf.Clamp(CurrentDistance, MinDistance, MaxDistance);

            Quaternion rotation = Quaternion.Euler(CurrentAngleY, CurrentAngleX, 0.0f);
            Vector3 disVector = new Vector3(CurrentPosX, CurrentPosY, -CurrentDistance);
            Vector3 position = rotation * disVector + Target.position;


            if (IsDamping)
            {
                transform.rotation = Quaternion.Lerp(transform.rotation, rotation, Time.deltaTime * Damping);
                transform.position = Vector3.Lerp(transform.position, position, Time.deltaTime * Damping);
            }
            else
            {
                transform.rotation = rotation;
                transform.position = position;
            }
        }
    }

    /// <summary>
    /// 设置Target
    /// </summary>
    /// <param name="tempTarget"></param>
    public void SetTarget(GameObject tempTarget)
    {
        ResetCamera();
        Target = tempTarget.transform;
    }

    /// <summary>
    /// 初始化摄像机
    /// </summary>
    public void ResetCamera()
    {
        CurrentAngleX = 0;
        CurrentAngleY = 0;

        CurrentPosX = transform.position.x;
        CurrentPosY = transform.position.y;

        transform.localPosition = new Vector3(0, 0, -7);
        CurrentDistance = 7;
        transform.localEulerAngles = new Vector3(0, 0, 0);
        InitNum();
        CanMove = true;
    }

    /// <summary>
    /// 角度转换
    /// </summary>
    /// <param name="angle"></param>
    /// <param name="min"></param>
    /// <param name="max"></param>
    /// <returns></returns>
    public static float ClampAngle(float angle, float min, float max)
    {
        if (angle < -360)
            angle += 360;
        if (angle > 360)
            angle -= 360;
        return Mathf.Clamp(angle, min, max);
    }
}

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答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、付费专栏及课程。

余额充值