Unity 720全景图相机代码(也是控制相机旋转缩放)

该代码基于LeanTouch插件进行的开发,可在触摸屏上操作,亦可使用键盘Alt+鼠标左键模拟双指

using UnityEngine;
using Lean.Touch;
using DG.Tweening;

public class CameraController : MonoBehaviour
{
    // 旋转速度
    public float rotationSpeed = 0.5f;

    // 移动速度
    public float moveSpeed = 0.1f;

    // 最小Field of View值
    public float minFieldOfView = 20f;

    // 最大Field of View值
    public float maxFieldOfView = 100f;

    // 相机的位置
    private Vector3 cameraPosition;

    // 上一次手指触摸的时间
    private float lastTouchTime = 0f;

    // 是否开启自动旋转
    private bool isAutoRotating = true;

    public Camera _cam;

    private void Start()
    {
        _cam = GetComponent<Camera>();
        // 初始化相机位置和距离
        cameraPosition = transform.position;
        distance = (transform.position - transform.parent.position).magnitude;

        // 订阅LeanTouch.OnFingerUpdate事件
        LeanTouch.OnFingerUpdate += OnFingerUpdate;
    }

    private void OnDestroy()
    {
        // 取消订阅LeanTouch.OnFingerUpdate事件
        LeanTouch.OnFingerUpdate -= OnFingerUpdate;
    }

    private void Update()
    {
        // 如果超过十秒没有手指触摸,则自动旋转相机
        if (Time.time - lastTouchTime > 10f)
        {
            isAutoRotating = true;
        }

        if (isAutoRotating)
        {
            // 缓慢将相机旋转值的x和z归0
            transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(0f, transform.rotation.eulerAngles.y, 0f), Time.deltaTime);
            transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(transform.rotation.eulerAngles.x, transform.rotation.eulerAngles.y, 0f), Time.deltaTime);

            // 自动旋转相机
            transform.RotateAround(transform.parent.position, Vector3.up, rotationSpeed * Time.deltaTime * 3);

            // 缓慢将Field of View值返回至60
            _cam.fieldOfView = Mathf.Lerp(_cam.fieldOfView, 80f, Time.deltaTime);
        }
    }

    private void OnFingerUpdate(LeanFinger finger)
    {
        // 更新手指触摸时间
        lastTouchTime = Time.time;
        // 检测手指的数量
        if (LeanTouch.Fingers.Count == 1)
        {            
            float MoveX = Input.GetAxis("Mouse X") * 5;
            float MoveY = Input.GetAxis("Mouse Y") * 5;

            //if (transform.rotation.eulerAngles.y + MoveX > 305 || transform.rotation.eulerAngles.y + MoveX < 55)
            transform.Rotate(new Vector3(0, MoveX, 0), Space.World);
            if (transform.rotation.eulerAngles.x - MoveY < 45 || transform.rotation.eulerAngles.x - MoveY > 315)
                transform.Rotate(new Vector3(-MoveY, 0, 0), Space.Self);

            // 关闭自动旋转
            isAutoRotating = false;
        }
        else if (LeanTouch.Fingers.Count == 2)
        {
            // 获取手指的移动量
            Vector2 delta = finger.ScreenDelta;

            // 计算相机的Field of View值
            float fieldOfView = _cam.fieldOfView - delta.y * moveSpeed;
            fieldOfView = Mathf.Clamp(fieldOfView, minFieldOfView, maxFieldOfView);

            // 更新相机的Field of View值
            _cam.fieldOfView = fieldOfView;

            isAutoRotating = false;
        }
    }
}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity中,可以通过操作相机来实现地图的缩放效果。首先,需要获取到相机的引用,通过代码获取相机的方式可以是通过Camera.main获取主摄像机,或是在脚本中声明一个public变量,并将相机拖拽到对应的变量中。 一种简单的方式是使用相机的orthographicSize属性来实现缩放。该属性是一个浮点数,表示相机的正交视图大小。较小的值会使地图缩小,较大的值会使地图放大。可以通过修改该值来实现地图的缩放效果。 通过在代码中访问相机的orthographicSize属性,可以设置地图的缩放程度。例如,将其设置为一个较小的值,如5,会使地图缩小,而将其设置为较大的值,如10,会使地图放大。根据具体需求,可以通过在代码中调整orthographicSize的值来实现地图的缩放。 另外,还可以结合相机的位置进行缩放。可以通过访问相机的transform属性,来修改相机的位置和旋转。例如,将相机向前移动一定的距离,会增加地图的缩放效果,而将相机向后移动一定的距离,则会减小地图的缩放效果。可以通过在代码中修改相机的transform属性来实现地图的缩放。 除了以上两种方法,还可以利用相机的正交投影矩阵和透视投影矩阵进行缩放。这种方式相对复杂一些,需要对相机的投影矩阵进行修改。根据具体情况,可以选择合适的方式来实现地图的缩放效果。 综上所述,可以通过修改相机的orthographicSize属性或transform属性,或者利用投影矩阵来实现Unity中地图的缩放效果。可以根据具体需求选择合适的方式,并在代码中进行相应的调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值