最近 遇到 需要对整个城市 进行观看 控制,可以拖动城市地图,放大缩小,点击建筑拉近围绕查看 等等(并且所有操作只用鼠标控制)

老夫敲代码 ctrl+c  ctrl+v,所有只能综合一下 多个大佬的代码 ,改改。

下面是控制相机,找的其他大神的相关代码

1.查看地图( 挂在 相机上)(忘记大佬的地址)

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

public class CameraMove : MonoSingleton_<CameraMove>
{
    [Header("模型")]
    public Transform targetmodel;
    public static Transform target;
    [Header("鼠标滚轮灵敏度")]
    [SerializeField]
    private int MouseWheelSensitivity = 2;
    [Header("最近距离")]
    [SerializeField]
    public  int MouseZoomMin = 750;
    [Header("最远距离")]
    [SerializeField]
    public  int MouseZoomMax =2000;
  
    [Header("水平旋转速度")]
    [SerializeField]
    private float xSpeed = 250.0f;
    [Header("竖直旋转速度")]
    [SerializeField]
    private float ySpeed = 120.0f;
    [Header("鼠标移动灵敏度")]
    [SerializeField]
    private float mouseMoveSensitivity = 5.0f;

    [Header("角度限制")]
    [SerializeField]
    private int yMinLimit = 0;
    [SerializeField]
    private int yMaxLimit = 89;

    [Header("摄像机初始角度")]
    [SerializeField]
    private float xRot = 0;
    [SerializeField]
    private float yRot = 0;


    [Header("摄像机位置")]
    [SerializeField]
    private Vector3 camPos;//= new Vector3(0, 0, 0);
    public  float normalDistance;//初始摄像机距离,无法在面板显示

    //如果没有可以注释掉
    //[Header("反射探针")]
    //[SerializeField]
    //private ReflectionProbe reflectionProbe;


    //这里也要开放出来
    //初始默认的角度,(y,x,0)
    public static float x;//= 69f;
    public static float y;// 34.2f;

    private Vector3 normalized;

    private Vector3 screenPoint;
    private Vector3 offset;

    private Quaternion rotation;
    public static Vector3 CameraTarget;
    public  bool isExit = false;

    public float YY;
    void Start()
    {
        //初始化
        YY = transform.position.y;
        x = yRot;
        y = xRot;
        target = targetmodel;
        //CameraTarget = target.position;
        Vector3 posC = camPos - target.position;
        Debug.Log(camPos);
        normalDistance = Mathf.Sqrt(Mathf.Pow(posC.x, 2) + Mathf.Pow(posC.y, 2) + Mathf.Pow(posC.z, 2));

        rotation = Quaternion.Euler(new Vector3(y, x, 0f));

        transform.rotation = rotation;
        float z = target.transform.position.z - normalDistance;
        transform.position = camPos;//rotation * new Vector3(transform.position.x, transform.position.y, z);
        CameraTarget = transform.position + transform.forward.normalized * normalDistance;
        //transform.LookAt(target);

        var angles = transform.eulerAngles;
        x = angles.y;
        y = angles.x;

    }
   
    void LateUpdate()
    {
        if (isExit)
        {
            if (Input.GetMouseButton(0))//鼠标左键
            {
                Vector3 p0 = Camera.main.transform.position;
                Vector3 p01 = p0 - Camera.main.transform.right * Input.GetAxisRaw("Mouse X") * Time.timeScale * mouseMoveSensitivity;
                Vector3 p03 = p01 - new Vector3(Camera.main.transform.forward.x, 0, Camera.main.transform.forward.z) 
                    * Input.GetAxisRaw("Mouse Y") * Time.timeScale * mouseMoveSensitivity;
                Camera.main.transform.position = p03;
                //Debug.Log("方向" + Camera.main.transform.forward + ",投影:" + Camera.main.transform.forward * Mathf.Sqrt(1 - Mathf.Pow(Vector3.Dot(Camera.main.transform.forward, new Vector3(0, -1, 0)), 2)));
                CameraTarget += (p03 - p0);
            }
            else if (Input.GetAxis("Mouse ScrollWheel") != 0)//鼠标滚轮
            {
              //  normalized = (transform.position - CameraTarget).normalized;
                if (normalDistance >= MouseZoomMin && normalDistance <= MouseZoomMax)
                {
                    Camera.main.transform.position += Camera.main.transform.forward * Input.GetAxisRaw("Mouse ScrollWheel") * Time.timeScale * MouseWheelSensitivity;
                    Vector3 p = Camera.main.transform.position - CameraTarget;
                    normalDistance = Mathf.Sqrt(Mathf.Pow(p.x, 2) + Mathf.Pow(p.y, 2) + Mathf.Pow(p.z, 2));
                }
                if (normalDistance < MouseZoomMin)
                {
                    normalDistance = MouseZoomMin;
                }
                if (normalDistance > MouseZoomMax)
                {
                    normalDistance = MouseZoomMax;
                }
                if (transform.position.y<800)//限制 最小距离
                {
                    transform.position = new Vector3(transform.position.x,800, transform.position.z);
                }
                if ( transform.position.y > 30000)//限制 最大距离
                {
                    transform.position = new Vector3(transform.position.x, 30000, transform.position.z);
                }
            }
            else if (Input.GetMouseButton(1))//鼠标右键
            {
                x += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
                y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
                y = ClampAngle(y, yMinLimit, yMaxLimit);
                var rotation = Quaternion.Euler(y, x, 0);
                //var position = rotation * new Vector3(0.0f, 0.0f, -normalDistance) + CameraTarget;

                transform.rotation = rotation;
                //transform.position = position;//回到初始位置
            }

            //transform.LookAt(CameraTarget);

            if (target.transform.position.y != 0)//
            {
                target.transform.position = new Vector3(target.transform.position.x, 0, target.transform.position.z);
            }

            反射探针,若无可以注释掉
            //Vector3 pos = Camera.main.transform.position - target.position;
            //Vector3 camPosition = Camera.main.transform.position;
            应该和反射探针的位置关于水面对称 p.y - target.y = -pos.y;
            //float y1 = Mathf.Abs(pos.y);
            //ReflectionProbe pro = reflectionProbe.GetComponent<ReflectionProbe>();
            //pro.size = new Vector3(pro.size.x, Mathf.Abs(y1) * 2 + 0.3f, pro.size.z);
            //Vector3 currentpos = pos - new Vector3(0, y1, 0);

            //reflectionProbe.transform.position = new Vector3(camPosition.x, camPosition.y - y1 * 2, camPosition.z);
            //cube.position = CameraTarget;
        }
    }
    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);
    }

}

2.围绕物体 放大缩小

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
//摄像机操作   
//删减版   在实际的使用中可能会有限制的需求  比如最大远离多少  最近距离多少   不能旋转到地面以下等
public class CamCtrl : MonoBehaviour
{
    public Transform CenObj;//围绕的物体
    private Vector3 Rotion_Transform;
    private new Camera camera;
    void Start()
    {
        camera = GetComponent<Camera>();
        Rotion_Transform = CenObj.position;
    }
    void Update()
    {
        Ctrl_Cam_Move();
        Cam_Ctrl_Rotation();
    }
    //镜头的远离和接近
    public void Ctrl_Cam_Move()
    {
        if (Input.GetAxis("Mouse ScrollWheel") > 0)
        {
            transform.Translate(Vector3.forward * 1f);//速度可调  自行调整
        }
        if (Input.GetAxis("Mouse ScrollWheel") < 0)
        {
            transform.Translate(Vector3.forward * -1f);//速度可调  自行调整
        }
    }
    //摄像机的旋转
    public void Cam_Ctrl_Rotation()
    {
        var mouse_x = Input.GetAxis("Mouse X");//获取鼠标X轴移动
        var mouse_y = -Input.GetAxis("Mouse Y");//获取鼠标Y轴移动
        if (Input.GetKey(KeyCode.Mouse1))
        {
            transform.RotateAround(Rotion_Transform, Vector3.up, mouse_x * 5);
            transform.RotateAround(Rotion_Transform, transform.right, mouse_y * 5);
        }
    }
}

3.摄像机 定位 物体

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
 
public class BaseCameraLookAtTarget : MonoBehaviour
{
    public Transform mainCameraTr;                                               //主摄像机
    public Transform lookAtTarget;                                          //摄像机看向的目标
    public float cameraDistance = 6.0F;                                     //摄像机与看向目标的距离
    public float cameraHeight = 3.0F;                                       //摄像机高度
    public float cmaeraOffset = 1.0F;                                       //摄像机的偏移
    public float mainCameraMoveSpeed = 2F;                                  //主摄像机移动的速度
    public float waitTime = 0F;                                               //等待摄像机移动到设备附近的时间
 
 
    private Vector3 lookAtTargetPosition;                                  //看向目标时的位置
    private Quaternion lookAtTargetRotation;                               //看向目标,且旋转
 
    public bool isLookAtAppointTarget = false;                                //是否看向指定的物体
    public bool isBack = false;
 
    private Vector3 mainCameraOriginalPosition;                            //主摄像机的原始位置
 
 
 
    public IEnumerator Start()
    {
        yield return new WaitForSeconds(0.1f);
        //记录主摄像机的原始位置
        if (mainCameraTr != null)
        {
            mainCameraOriginalPosition = mainCameraTr.localPosition;
        }
    }
 
 
    private void FixedUpdate()
    {
 
        if (isLookAtAppointTarget == true)
        {
            mainCameraTr.position = Vector3.Lerp(mainCameraTr.position, lookAtTargetPosition, Time.deltaTime * mainCameraMoveSpeed);
            mainCameraTr.LookAt(lookAtTarget);
 
            // StartCoroutine(Stop(waitTime));
        }
        if (isBack == true)
        {
            mainCameraTr.position = Vector3.Lerp(mainCameraTr.position, lookAtTargetPosition, Time.deltaTime * mainCameraMoveSpeed);
 
            //StartCoroutine(Stop(waitTime));
        }
 
    }
 
    /// <summary>
    /// 摄像机看向指定物体的方法
    /// </summary>
    public void LookAtAppointTarget()
    {
 
        if (lookAtTarget != null)
        {
            lookAtTargetPosition = new Vector3(lookAtTarget.transform.position.x + cmaeraOffset, lookAtTarget.transform.position.y + cameraHeight, lookAtTarget.transform.position.z + cameraDistance);
            isLookAtAppointTarget = true;
 
        }
        else
        {
            Debug.LogError(GetType() + "/LookAtAppointTarget()/看向的物体不存在,请检查!!!");
        }
 
 
    }
 
    //摄像机返回原始位置
    public void ReturnOriginalPosition()
    {
        lookAtTargetPosition = new Vector3(mainCameraOriginalPosition.x, mainCameraOriginalPosition.y, mainCameraOriginalPosition.z);
        isBack = true;
 
    }
 
    IEnumerator Stop(float waitTime)
    {
        yield return new WaitForSeconds(waitTime);
        if (isLookAtAppointTarget == true)
        {
            isLookAtAppointTarget = false;
        }
        if (isBack == true)
        {
            isBack = false;
        }
 
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class CameraLookAtControl : BaseCameraLookAtTarget
{
    private void Start()
    {
        mainCameraTr = Camera.main.transform;
        StartCoroutine(base.Start());
    }
 
    public void SetCameraLookAtObj(Transform cameraTr, Transform target)
    {
        mainCameraTr = cameraTr;
        lookAtTarget = target;
        LookAtAppointTarget();
    }
}

4.我自己 改的  综合了一下 捉急用改的就不仔细, 将就用吧

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

public class CameraMove : MonoSingleton_<CameraMove>
{
    [Header("模型")]
    public Transform targetmodel;
    public static Transform target;
    [Header("鼠标滚轮灵敏度")]
    [SerializeField]
    private int MouseWheelSensitivity = 2;
    [Header("最近距离")]
    [SerializeField]
    public int MouseZoomMin = 750;
    [Header("最远距离")]
    [SerializeField]
    public int MouseZoomMax = 2000;

    [Header("水平旋转速度")]
    [SerializeField]
    private float xSpeed = 150.0f;
    [Header("竖直旋转速度")]
    [SerializeField]
    private float ySpeed = 80.0f;
    [Header("鼠标移动灵敏度")]
    [SerializeField]
    private float mouseMoveSensitivity = 3.0f;

    [Header("角度限制")]
    [SerializeField]
    private int yMinLimit = 0;
    [SerializeField]
    private int yMaxLimit = 89;

    [Header("摄像机初始角度")]
    [SerializeField]
    private float xRot = 0;
    [SerializeField]
    private float yRot = 0;


    [Header("摄像机位置")]
    [SerializeField]
    private Vector3 camPos;//= new Vector3(0, 0, 0);
    public float normalDistance;//初始摄像机距离,无法在面板显示

    //如果没有可以注释掉
    //[Header("反射探针")]
    //[SerializeField]
    //private ReflectionProbe reflectionProbe;


    //这里也要开放出来
    //初始默认的角度,(y,x,0)
    public static float x;//= 69f;
    public static float y;// 34.2f;

    private Vector3 normalized;

    private Vector3 screenPoint;
    private Vector3 offset;

    private Quaternion rotation;
    public static Vector3 CameraTarget;
    // [HideInInspector]
    public bool isExit;
    public bool isShuBiao;

    void Start()
    {
        //初始化
        isExit = true;
        isShuBiao = true;
        x = yRot;
        y = xRot;
        target = targetmodel;
        //CameraTarget = target.position;
        Vector3 posC = camPos - target.position;
        Debug.Log(camPos);
        normalDistance = Mathf.Sqrt(Mathf.Pow(posC.x, 2) + Mathf.Pow(posC.y, 2) + Mathf.Pow(posC.z, 2));

        rotation = Quaternion.Euler(new Vector3(y, x, 0f));

        transform.rotation = rotation;
        float z = target.transform.position.z - normalDistance;
        transform.position = camPos;//rotation * new Vector3(transform.position.x, transform.position.y, z);
        CameraTarget = transform.position + transform.forward.normalized * normalDistance;
        //transform.LookAt(target);

        var angles = transform.eulerAngles;
        x = angles.y;
        y = angles.x;


        //--------------------围绕的物体并且 相机定位物体------------//
        mainCameraTr = this.transform;
        camera = GetComponent<Camera>();
        Rotion_Transform = CenObj.position;
        // camera.transform.forward = (CenObj.localPosition - camera.transform.localPosition).normalized;
        //bo = true;

    }

    void LateUpdate()
    {
        if (isExit)
        {
            if (isShuBiao)
            {
                if (Input.GetMouseButton(0))//鼠标左键
                {
                    Vector3 p0 = Camera.main.transform.position;
                    Vector3 p01 = p0 - Camera.main.transform.right * Input.GetAxisRaw("Mouse X") * Time.timeScale * mouseMoveSensitivity;
                    Vector3 p03 = p01 - new Vector3(Camera.main.transform.forward.x, 0, Camera.main.transform.forward.z)
                        * Input.GetAxisRaw("Mouse Y") * Time.timeScale * mouseMoveSensitivity;
                    Camera.main.transform.position = p03;

                    CameraTarget += (p03 - p0);
                }
                else if (Input.GetAxis("Mouse ScrollWheel") != 0)//鼠标滚轮
                {
                    //  normalized = (transform.position - CameraTarget).normalized;
                    if (normalDistance >= MouseZoomMin && normalDistance <= MouseZoomMax)
                    {
                        Camera.main.transform.position += Camera.main.transform.forward * Input.GetAxisRaw("Mouse ScrollWheel") * Time.timeScale * MouseWheelSensitivity;
                        Vector3 p = Camera.main.transform.position - CameraTarget;
                        normalDistance = Mathf.Sqrt(Mathf.Pow(p.x, 2) + Mathf.Pow(p.y, 2) + Mathf.Pow(p.z, 2));
                    }
                    if (normalDistance < MouseZoomMin)
                    {
                        normalDistance = MouseZoomMin;
                    }
                    if (normalDistance > MouseZoomMax)
                    {
                        normalDistance = MouseZoomMax;
                    }
                    if (transform.position.y < 800)//限制 最小距离
                    {
                        transform.position = new Vector3(transform.position.x, 800, transform.position.z);
                    }
                    if (transform.position.y > 7000)//限制 最大距离
                    {
                        transform.position = new Vector3(transform.position.x, 7000, transform.position.z);
                    }
                }
                else if (Input.GetMouseButton(1))//鼠标右键
                {
                    Debug.Log("x=" + x + "  y=" + y);
                    y += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
                    x -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
                    x = ClampAngle(x, yMinLimit, yMaxLimit);
                    var rotation = Quaternion.Euler(x, y, 0);
                    //var position = rotation * new Vector3(0.0f, 0.0f, -normalDistance) + CameraTarget;

                    transform.rotation = rotation;
                    //transform.position = position;//回到初始位置
                }
            }
            else
            {
                if (transform.position.y > 3000)//限制 最小距离
                {
                    isShuBiao = true;
                }
                //缩放
                if (Input.GetAxis("Mouse ScrollWheel") > 0)
                {
                    transform.Translate(Vector3.forward * 100f);//速度可调  自行调整
                }
                if (Input.GetAxis("Mouse ScrollWheel") < 0)
                {
                    transform.Translate(Vector3.forward * -100f);//速度可调  自行调整
                }
                //旋转 

                x = transform.localEulerAngles.x;//设置 角度,很重要
                y = transform.localEulerAngles.y;
               
                Debug.Log("xuanxuan  x=" + transform.localEulerAngles.x + "  y=" + y);
                var mouse_x = Input.GetAxis("Mouse X") * xSpeed * 0.02f;//获取鼠标X轴移动
                var mouse_y = -Input.GetAxis("Mouse Y") * ySpeed * 0.02f;//获取鼠标Y轴移动
                if (Input.GetKey(KeyCode.Mouse1))
                {
                    transform.RotateAround(Rotion_Transform, Vector3.up, mouse_x);
                    transform.RotateAround(Rotion_Transform, transform.right, mouse_y);
                }


                //Ctrl_Cam_Move();
                //Cam_Ctrl_Rotation();
            }
        }
    }
   
    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);
    }

    //--------------------围绕的物体并且 相机定位物体------------//

    public Transform CenObj;//围绕的物体
    private Vector3 Rotion_Transform;
    private new Camera camera;

    //bool bo;


    private  Transform mainCameraTr;                                               //主摄像机
    public Transform lookAtTarget;                                          //摄像机看向的目标
   private float cameraDistance =50.0F;                                     //摄像机与看向目标的距离
   private float cameraHeight = 800.0F;                                       //摄像机高度
    private float cmaeraOffset = 1000.0F;                                       //摄像机的偏移
    private float mainCameraMoveSpeed = 1F;                                  //主摄像机移动的速度

    private Vector3 lookAtTargetPosition;                                  //看向目标时的位置
    private Quaternion lookAtTargetRotation;                               //看向目标,且旋转

    public bool isLookAtAppointTarget = false;                                //是否看向指定的物体


    public void SetInit(Transform CenObj_)
    {
        Debug.Log("点击了=" + CenObj_.name);

        isShuBiao = true;
        CenObj = CenObj_;
        Rotion_Transform = CenObj.position;

        lookAtTarget = CenObj_;
        LookAtAppointTarget();
        isShuBiao = false;
    }
    void Update()
    {
        //if (!isExit)
        //{
        //    Ctrl_Cam_Move();
        //    Cam_Ctrl_Rotation();
        //}
    }
    /// <summary>
    /// 镜头的远离和接近
    /// </summary>
    public void Ctrl_Cam_Move()
    {
        if (Input.GetAxis("Mouse ScrollWheel") > 0)
        {
            transform.Translate(Vector3.forward * 100f);//速度可调  自行调整
        }
        if (Input.GetAxis("Mouse ScrollWheel") < 0)
        {
            transform.Translate(Vector3.forward * -100f);//速度可调  自行调整
        }
       
    }
    /// <summary>
    /// 摄像机的旋转
    /// </summary>
    public void Cam_Ctrl_Rotation()
    {
        var mouse_x = Input.GetAxis("Mouse X") * xSpeed * 0.02f;//获取鼠标X轴移动
        var mouse_y = -Input.GetAxis("Mouse Y") * ySpeed * 0.02f;//获取鼠标Y轴移动
        if (Input.GetKey(KeyCode.Mouse1))
        {
            transform.RotateAround(Rotion_Transform, Vector3.up, mouse_x * 5);
            transform.RotateAround(Rotion_Transform, transform.right, mouse_y * 5);
        }
      
    }

    /// <summary>
    /// 摄像机看向指定物体的方法
    /// </summary>
    public void LookAtAppointTarget()
    {
        if (lookAtTarget != null)
        {
            lookAtTargetPosition = new Vector3(lookAtTarget.transform.position.x + cmaeraOffset,
               lookAtTarget.transform.position.y + cameraHeight, lookAtTarget.transform.position.z + cameraDistance);
            isLookAtAppointTarget = true;

        }
        else
        {
            Debug.LogError(GetType() + "/LookAtAppointTarget()/看向的物体不存在,请检查!!!");
        }

        if (isLookAtAppointTarget == true)//是否看向物体
        {
            mainCameraTr.position = Vector3.Lerp(mainCameraTr.position, lookAtTargetPosition, 1 * mainCameraMoveSpeed);
            mainCameraTr.LookAt(lookAtTarget);
        }
        //if (isBack == true)
        //{
        //    mainCameraTr.position = Vector3.Lerp(mainCameraTr.position, lookAtTargetPosition, 10 * mainCameraMoveSpeed);
        //}
    }

}

//相机围绕 物体查看 

using UnityEngine;
using QFramework;
using Scripts;
using System;
using System.Collections.Generic;
using InterFuncitions;
/// <summary>
/// 该脚本需要挂在摄像机上
/// </summary>
public class CameraController : MonoBehaviour
{
    public Transform targetObject;
    public Vector3 targetOffset;
    public float averageDistance = 5.0f;//初始位置 镜头远近
    public float maxDistance = 20;
    public float minDistance = .6f;
    public float xSpeed = 200.0f;
    public float ySpeed = 200.0f;
    public int yMinLimit = -80;
    public int yMaxLimit = 80;

    public int xMinLimit = -80;
    public int xMaxLimit = 80;

    public int zoomSpeed = 40;
    public float panSpeed = 0.3f;
    public float zoomDampening = 5.0f;
    public float rotateOnOff = 1;

    private float xDeg = 0.0f;
    private float yDeg = 0.0f;
    private float currentDistance;
    private float desiredDistance;
    private Quaternion currentRotation;
    private Quaternion desiredRotation;
    private Quaternion rotation;
    private Vector3 position;
    private float idleTimer = 0.0f;
    private float idleSmooth = 0.0f;

    void Start() { Init(); }
    void OnEnable() { Init(); }

    public void Init()
    {
        tt();
    }
    public void tt()
    {
        if (!targetObject)
        {
            GameObject go = new GameObject("Cam Target");
            go.transform.position = transform.position + (transform.forward * averageDistance);
            targetObject = go.transform;
        }

        currentDistance = averageDistance;
        desiredDistance = averageDistance;

        position = transform.position;
        rotation = transform.rotation;
        currentRotation = transform.rotation;
        desiredRotation = transform.rotation;

        xDeg = Vector3.Angle(Vector3.right, transform.right);
        yDeg = Vector3.Angle(Vector3.up, transform.up);
        position = targetObject.position - (rotation * Vector3.forward * currentDistance + targetOffset);
    }
    void LateUpdate()
    {
        if (Input.GetMouseButton(2) && Input.GetKey(KeyCode.LeftAlt) && Input.GetKey(KeyCode.LeftControl))
        {
            desiredDistance -= Input.GetAxis("Mouse Y") * 0.02f * zoomSpeed * 0.125f * Mathf.Abs(desiredDistance);
        }
        else if (Input.GetMouseButton(0))
        {
            xDeg += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
            yDeg -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
            yDeg = ClampAngle(yDeg, yMinLimit, yMaxLimit);
            xDeg = ClampAngle(xDeg, xMinLimit, xMaxLimit);


            desiredRotation = Quaternion.Euler(yDeg, xDeg, 0);
            currentRotation = transform.rotation;
            rotation = Quaternion.Lerp(currentRotation, desiredRotation, 0.02f * zoomDampening);
            transform.rotation = rotation;
            idleTimer = 0;
            idleSmooth = 0;

        }
        else
        {
            //自动旋转

            //idleTimer += 0.02f;
            //if (idleTimer > rotateOnOff && rotateOnOff > 0)
            //{
            //    idleSmooth += (0.02f + idleSmooth) * 0.005f;
            //    idleSmooth = Mathf.Clamp(idleSmooth, 0, 1);
            //    xDeg += xSpeed * 0.001f * idleSmooth;
            //}

            //yDeg = ClampAngle(yDeg, yMinLimit, yMaxLimit);
            //desiredRotation = Quaternion.Euler(yDeg, xDeg, 0);
            //currentRotation = transform.rotation;
            //rotation = Quaternion.Lerp(currentRotation, desiredRotation, 0.02f * zoomDampening * 2);
            //transform.rotation = rotation;
        }

        desiredDistance -= Input.GetAxis("Mouse ScrollWheel") * 0.02f * zoomSpeed * Mathf.Abs(desiredDistance);
        desiredDistance = Mathf.Clamp(desiredDistance, minDistance, maxDistance);
        currentDistance = Mathf.Lerp(currentDistance, desiredDistance, 0.02f * zoomDampening);
        position = targetObject.position - (rotation * Vector3.forward * currentDistance + targetOffset);
        transform.position = position;
    }

    private 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);
    }

}

Unity 键盘WASD 实现物体移动

1.将脚本挂在Capsule物体下,WASD 控制移动方向,滑动鼠标滚轮 向上移动,向下移动

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

    public class MoveCam : MonoBehaviour
    {
        private Vector3 m_camRot;
        public  Transform m_camTransform;//摄像机Transform
        private Transform m_transform;//摄像机父物体Transform
        public float m_movSpeed = 10;//移动系数
        public float m_rotateSpeed = 1;//旋转系数
        private void Start()
        {
           // m_camTransform = Camera.main.transform;
            m_transform = GetComponent<Transform>();
        }
        private void Update()
        {
            Control();
        }
        void Control()
        {
            if (Input.GetMouseButton(1))
            {
                //获取鼠标移动距离
                float rh = Input.GetAxis("Mouse X");
                float rv = Input.GetAxis("Mouse Y");

                // 旋转摄像机
                m_camRot.x -= rv * m_rotateSpeed;
                m_camRot.y += rh * m_rotateSpeed;

            }

            m_camTransform.eulerAngles = m_camRot;

            // 使主角的面向方向与摄像机一致
            Vector3 camrot = m_camTransform.eulerAngles;
            camrot.x = 0; camrot.z = 0;
            m_transform.eulerAngles = camrot;

            // 定义3个值控制移动
            float xm = 0, ym = 0, zm = 0;

            //按键盘W向上移动
            if (Input.GetKey(KeyCode.W))
            {
                zm += m_movSpeed * Time.deltaTime;
            }
            else if (Input.GetKey(KeyCode.S))//按键盘S向下移动
            {
                zm -= m_movSpeed * Time.deltaTime;
            }

            if (Input.GetKey(KeyCode.A))//按键盘A向左移动
            {
                xm -= m_movSpeed * Time.deltaTime;
            }
            else if (Input.GetKey(KeyCode.D))//按键盘D向右移动
            {
                xm += m_movSpeed * Time.deltaTime;
            }
          
            if (Input.GetAxis("Mouse ScrollWheel") > 0 && m_transform.position.y <= 1500)
            {
                ym += m_movSpeed * Time.deltaTime;
            }
            if (Input.GetAxis("Mouse ScrollWheel") < 0 && m_transform.position.y >= 100)
            {
                ym -= m_movSpeed * Time.deltaTime;
            }
            m_transform.Translate(new Vector3(xm, ym, zm), Space.Self);
        }
    }

2.WASD 控制移动方向,滑动鼠标滚轮 向上移动,向下移动

/**********************************************************************
 文件信息
 文件名(File Name):                CameraController03.cs
 作者(Author):                      TianWenQuan
 创建时间(CreateTime):             #CREATETIME#
 Unity版本(UnityVersion):         #UNITYVERSION#
 项目:三峡库区消落带植物群落组成及其对水位变化的响应虚拟仿真实验
 **********************************************************************/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
namespace Twq
{
 public class CameraController03 : MonoBehaviour
 {

        public static CameraController03 Instance;
        [Header("模型")]
        public Transform targetmodel;
        public static Transform target;
        [Header("鼠标滚轮灵敏度")]
        [SerializeField]
        private int MouseWheelSensitivity = 2;
        [Header("最近距离")]
        [SerializeField]
        public int MouseZoomMin = 750;
        [Header("最远距离")]
        [SerializeField]
        public int MouseZoomMax = 2000;

        [Header("水平旋转速度")]
        [SerializeField]
        private float xSpeed = 150.0f;
        [Header("竖直旋转速度")]
        [SerializeField]
        private float ySpeed = 80.0f;
        [Header("鼠标移动灵敏度")]
        [SerializeField]
        private float mouseMoveSensitivity = 3.0f;

        [Header("角度限制")]
        [SerializeField]
        private int yMinLimit = 0;
        [SerializeField]
        private int yMaxLimit = 89;

        [Header("摄像机初始角度")]
        [SerializeField]
        private float xRot = 0;
        [SerializeField]
        private float yRot = 0;


        [Header("摄像机位置")]
        [SerializeField]
        private Vector3 camPos;//= new Vector3(0, 0, 0);
        public float normalDistance;//初始摄像机距离,无法在面板显示

        public static float x;//= 69f;
        public static float y;// 34.2f;

      
        private Quaternion rotation;
        public static Vector3 CameraTarget;
        // [HideInInspector]
        public bool isExit;//打开 控制相机
        public bool isShuBiao;//Flase=拉近 状态

        public Transform SelfTransform;
        private void Awake()
        {
            Instance = this;
            SelfTransform = this.transform;
        }
        void Start()
        {
            //初始化
            isExit = true;
            isShuBiao = true;
            x = yRot;
            y = xRot;
            target = targetmodel;
            Vector3 posC = camPos - target.position;
            normalDistance = Mathf.Sqrt(Mathf.Pow(posC.x, 2) + Mathf.Pow(posC.y, 2) + Mathf.Pow(posC.z, 2));

            rotation = Quaternion.Euler(new Vector3(y, x, 0f));

            transform.rotation = rotation;
            float z = target.transform.position.z - normalDistance;
            transform.position = camPos;//rotation * new Vector3(transform.position.x, transform.position.y, z);
            CameraTarget = transform.position + transform.forward.normalized * normalDistance;
           
            x = transform.localEulerAngles.x;
            y = transform.localEulerAngles.y;

        }
        public void Init()
        {
            isExit = true;
            isShuBiao = true;

            Vector3 posC = camPos - target.position;

            normalDistance = Mathf.Sqrt(Mathf.Pow(posC.x, 2) + Mathf.Pow(posC.y, 2) + Mathf.Pow(posC.z, 2));

            rotation = Quaternion.Euler(new Vector3(90f, 0f, 0f));

            transform.rotation = rotation;

            transform.position = new Vector3(0f, 0f, 0f);
            CameraTarget = transform.position + transform.forward.normalized * normalDistance;

            x = transform.localEulerAngles.x;
            y = transform.localEulerAngles.y;

        }
        public float movespeed = 500;
        void LateUpdate()
        {
            if (isExit)
            {
                if (isShuBiao)
                {
                    // 定义3个值控制移动
                    float xm = 0, zm = 0;
                   
                   
                    //按键盘W向上移动
                    if (Input.GetKey(KeyCode.UpArrow) || Input.GetKey(KeyCode.W))
                    {
                        if (transform.position.y <= MouseZoomMin)//限制 最小距离
                        {
                            
                        }
                        else
                        {
                            this.transform.Translate(Vector3.forward * movespeed * Time.deltaTime);
                        }

                    }
                    else if (Input.GetKey(KeyCode.DownArrow) || Input.GetKey(KeyCode.S))//按键盘S向下移动
                    {
                        if (transform.position.y >= MouseZoomMax)//限制 最大距离
                        {
                            
                        }
                        else
                        {
                            this.transform.Translate(Vector3.back * movespeed * Time.deltaTime);
                        }
                        
                    }

                    if (Input.GetKey(KeyCode.LeftArrow) || Input.GetKey(KeyCode.A))//按键盘A向左移动
                    {
                        // xm -= 500 * Time.deltaTime;
                        this.transform.Translate(Vector3.left * movespeed * Time.deltaTime);
                    }
                    else if (Input.GetKey(KeyCode.RightArrow) || Input.GetKey(KeyCode.D))//按键盘D向右移动
                    {
                        //  xm += 500 * Time.deltaTime;
                        this.transform.Translate(Vector3.right * movespeed * Time.deltaTime);
                    }
                    if (Input.GetMouseButton(1))//鼠标右键
                    {
                        y += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
                        x -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
                        x = ClampAngle(x, yMinLimit, yMaxLimit);
                        var rotation = Quaternion.Euler(x, y, 0);

                        transform.rotation = rotation;
                    }
                    else if (Input.GetAxis("Mouse ScrollWheel") != 0)//鼠标滚轮
                    {
                        //  normalized = (transform.position - CameraTarget).normalized;
                        if (normalDistance >= MouseZoomMin && normalDistance <= MouseZoomMax)
                        {
                            this.transform.position += this.transform.forward * Input.GetAxisRaw("Mouse ScrollWheel") * Time.timeScale * MouseWheelSensitivity;
                            Vector3 p = this.transform.position - CameraTarget;
                            normalDistance = Mathf.Sqrt(Mathf.Pow(p.x, 2) + Mathf.Pow(p.y, 2) + Mathf.Pow(p.z, 2));
                        }
                        if (normalDistance < MouseZoomMin)
                        {
                            normalDistance = MouseZoomMin;
                        }
                        if (normalDistance > MouseZoomMax)
                        {
                            normalDistance = MouseZoomMax;
                        }
                        if (transform.position.y < MouseZoomMin)//限制 最小距离
                        {
                            transform.position = new Vector3(transform.position.x, MouseZoomMin, transform.position.z);
                        }
                        if (transform.position.y > MouseZoomMax)//限制 最大距离
                        {
                            transform.position = new Vector3(transform.position.x, MouseZoomMax, transform.position.z);
                        }
                    }
                    
                }
                else
                {
                    if (transform.position.y > MouseZoomMax)//限制 最小距离
                    {
                        isShuBiao = true;
                    }
                    //缩放
                    if (Input.GetAxis("Mouse ScrollWheel") > 0)
                    {
                        transform.Translate(Vector3.forward * 100f);//速度可调  自行调整
                    }
                    if (Input.GetAxis("Mouse ScrollWheel") < 0)
                    {
                        transform.Translate(Vector3.forward * -100f);//速度可调  自行调整
                    }
                    //旋转 
                    x = transform.localEulerAngles.x;
                    y = transform.localEulerAngles.y;

                }
            }
        }

        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);
        }

        //--------------------围绕的物体并且 相机定位物体-------------------//
        #region
        //public Transform CenObj;//围绕的物体
        //private Vector3 Rotion_Transform;
        //private new Camera camera;

        bool bo;


        //private Transform mainCameraTr;                                               //主摄像机
        //public Transform lookAtTarget;                                          //摄像机看向的目标
        //private float cameraDistance = 50.0F;                                     //摄像机与看向目标的距离
        //private float cameraHeight = 800.0F;                                       //摄像机高度
        //private float cmaeraOffset = 1000.0F;                                       //摄像机的偏移
        //private float mainCameraMoveSpeed = 1F;                                  //主摄像机移动的速度

        //private Vector3 lookAtTargetPosition;                                  //看向目标时的位置
        //private Quaternion lookAtTargetRotation;                               //看向目标,且旋转

        //public bool isLookAtAppointTarget = false;                                //是否看向指定的物体


        //public void SetInit(Transform CenObj_)
        //{
        //    Debug.Log("点击了=" + CenObj_.name);

        //    isShuBiao = true;
        //    CenObj = CenObj_;
        //    Rotion_Transform = CenObj.position;

        //    lookAtTarget = CenObj_;
        //    LookAtAppointTarget();
        //    isShuBiao = false;
        //}
        //void Update()
        //{
        //    //if (!isExit)
        //    //{
        //    //    Ctrl_Cam_Move();
        //    //    Cam_Ctrl_Rotation();
        //    //}
        //}


        / <summary>
        / 摄像机看向指定物体的方法
        / </summary>
        //public void LookAtAppointTarget()
        //{
        //    if (lookAtTarget != null)
        //    {
        //        lookAtTargetPosition = new Vector3(lookAtTarget.transform.position.x + cmaeraOffset,
        //           lookAtTarget.transform.position.y + cameraHeight, lookAtTarget.transform.position.z + cameraDistance);
        //        isLookAtAppointTarget = true;

        //    }
        //    else
        //    {
        //        Debug.LogError(GetType() + "/LookAtAppointTarget()/看向的物体不存在,请检查!!!");
        //    }

        //    if (isLookAtAppointTarget == true)//是否看向物体
        //    {
        //        mainCameraTr.position = Vector3.Lerp(mainCameraTr.position, lookAtTargetPosition, 1 * mainCameraMoveSpeed);
        //        mainCameraTr.LookAt(lookAtTarget);
        //    }
        //    //if (isBack == true)
        //    //{
        //    //    mainCameraTr.position = Vector3.Lerp(mainCameraTr.position, lookAtTargetPosition, 10 * mainCameraMoveSpeed);
        //    //}
        //}
        #endregion
    }
}