Unity 相机围绕着目标点旋转、缩放

在这里插入图片描述
CameraRoot的中心点与Cube的中心点在一块。相机将围绕着Cube进行旋转、缩放

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 相机围绕着目标点旋转、缩放。
/// 其中目标点为CameraRoot 
/// </summary>
[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;

    public CameraParameter(bool limitXAngle=true
        ,float minXAngle=0f
        ,float maxXAngle=80f
        ,bool limitYAngle=false
        ,float minYAngle=0f
        ,float maxYAngle=0f
        ,float orbitSensitive=10f
        ,float mouseMoveRatio=0.3f)
    {
        this.limitXAngle = limitXAngle;
        this.minXAngle = minXAngle;
        this.maxXAngle = maxXAngle;
        this.limitYAngle = limitYAngle;
        this.minYAngle = minYAngle;
        this.maxYAngle = maxYAngle;
        this.orbitSensitive = orbitSensitive;
        this.mouseMoveRatio = mouseMoveRatio;
    }

}

public class CmeraOrbit : MonoBehaviour
{

    private Vector3 lastMousePos;
    private Vector3 targetEulerAngle;
    private Vector3 eulerAngle;

    public CameraParameter freeOrbitParameter;
    private CameraParameter cureentCameraParameter;

    public Transform cameraRootTf;
    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;

    public float[] yMinAngles;
    public float[] yMaxAngles;
    public bool[] isAlreadyFire;

    void Start()
    {
        originalRotate = cameraRootTf.localRotation;
        cameraDistance = cameraTf.localPosition.z;
        targetCameraDistance = cameraDistance;
        cureentCameraParameter = freeOrbitParameter;
        isAlreadyFire=new bool[yMinAngles.Length];
    }

    void Update()
    {
        Oribit();
        Zoom();
    }

    private void Oribit()
    {
        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);
            cameraRootTf.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(0f,0f,-cameraDistance);
        }
    }
}

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值