Unity相机围绕物体旋转移动缩放

using DG.Tweening;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public class CameraC : MonoBehaviour
{
    public Transform targetModel;//目标模型
    // 移动速度
    public float speed = 20;
    // 旋转距离
    public float distance_v;
    public float distance_h;
    // 旋转速度
    public float rotation_H_speed = 1;
    public float rotation_V_speed = 1;
    // 平移速度
    public float move_H_speed = 1;
    public float move_V_speed = 1;

    public static float current_rotation_H;  //水平旋转结果
    public static float current_rotation_V;  //垂直旋转结果

    // 旋转限制
    public static float maxUpAngle = 85;
    public static float maxDownAngle = 5;

    // 平移限制
    public static float transMaxUp = 400;
    public static float transMaxDown = 20;

    // 缩放限制
    public static float zoomMax = 400;
    public static float zoomMin = 5;

    public static float zoomSpeed = 15;


    public static BaseModel selectModel;
    [Logger]
    private IWebLogger logger;

    public static bool isRotation = false;

    private Vector3 mForward;


    private void Start()
    {
        current_rotation_H = transform.localEulerAngles.y;
        current_rotation_V = transform.localEulerAngles.x;
    }

    // Update is called once per frame
    void Update()
    {
        #region 按键移动

        if (Input.GetKey(KeyCode.A)) //左移
        {
            transform.Translate(Vector3.left * speed * Time.deltaTime);
        }

        if (Input.GetKey(KeyCode.D)) //右移
        {
            transform.Translate(Vector3.right * speed * Time.deltaTime);
        }

        if (Input.GetKey(KeyCode.W)) //前移
        {
            transform.Translate(Vector3.forward * speed * Time.deltaTime);
        }

        if (Input.GetKey(KeyCode.S)) //后移
        {
            transform.Translate(Vector3.back * speed * Time.deltaTime);
        }

        if (Input.GetKey(KeyCode.Q)) //上移
        {
            transform.Translate(Vector3.up * speed * Time.deltaTime);
        }

        if (Input.GetKey(KeyCode.E)) //下移
        {
            transform.Translate(Vector3.down * speed * Time.deltaTime);
        }

        #endregion

        // 缩放
        if (Input.GetAxis("Mouse ScrollWheel") != 0)
        {
            //获取鼠标滚轮的滑动量
            float wheel = Input.GetAxis("Mouse ScrollWheel") * Time.deltaTime * zoomSpeed;

            //改变相机的位置
            //Vector3 pos = Vector3.forward* wheel;
            //float y = pos.y + transform.position.y;

            //y = Mathf.Clamp(y, zoomMaxDown, zoomMaxUp);

            //transform.position = new Vector3(transform.position.x, y, transform.position.z);
            //this.transform.Translate(pos);
            //print(Vector3.Distance(transform.position, targetModel.position));

            if (Vector3.Distance(transform.position, targetModel.position) < zoomMin && wheel > 0) return;
            if (Vector3.Distance(transform.position, targetModel.position) > zoomMax && wheel < 0) return;
            mForward = targetModel.position - Camera.main.transform.position;
            transform.position += mForward * wheel;
        }

        // F键聚焦当前物体
        if (Input.GetKeyUp(KeyCode.F))
        {
            if (selectModel != null)
            {
                transform.LookAt(selectModel.transform);
            }
        }
    }

    private void LateUpdate()
    {
        // 点击 并获取点击物体
        if (Input.GetMouseButtonUp(0))
        {
            // 前端 click() ---> 点击物体    
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit, 2000))
            {
                Debug.DrawLine(ray.origin, hit.point, Color.red, 0.5f);
                //Debug.Log(hit.point);
                BaseModel baseModel = hit.collider.gameObject.GetComponent<BaseModel>();
                if (baseModel != null)
                {
                    selectModel = baseModel;

                    logger.Log("id:" + baseModel.Uuid + " prefabName:" + baseModel.BaseData.PrefabName + 
                        " position:" + baseModel.BaseData.Transform.position +
                        " modelType:" + baseModel.modelType);

                    // 触发点击事件
                    if (!baseModel.BaseData.IsNoClick)
                    {
                        Sender sender = new Sender();
                        sender.eventName = BaseEvent.click;
                        sender.souce = gameObject;
                        EventCenter.Instance.TriggerEvent(BaseEvent.click, sender, baseModel.Uuid);
                    }
                    
                }
            }
        }

        // 旋转
        if (Input.GetMouseButton(1))
        {
            //控制旋转
            //current_rotation_H += Input.GetAxis("Mouse X") * rotation_H_speed;
            //current_rotation_V += Input.GetAxis("Mouse Y") * rotation_V_speed;

            //current_rotation_V = Mathf.Clamp(current_rotation_V, maxDownAngle, maxUpAngle);

            //transform.localEulerAngles = new Vector3(current_rotation_V, current_rotation_H, transform.localEulerAngles.z);       

            //transform.Translate(Vector3.back * distance_h, Space.Self);
            //transform.Translate(Vector3.up * distance_v, Space.World);          //相对于世界坐标y轴向上

            var mouse_x = Input.GetAxis("Mouse X");//获取鼠标X轴移动
            var mouse_y = -Input.GetAxis("Mouse Y");//获取鼠标Y轴移动


            transform.RotateAround(targetModel.transform.position, Vector3.up, mouse_x * 5);
            //transform.RotateAround(targetModel.transform.position, transform.right, mouse_y * 5);

            //预设角度(当前角度加上将要增加/减少的角度)
            float rotatedAngle = transform.eulerAngles.x + mouse_y * rotation_H_speed;

            //旋转角度小于5则设置为5
            if (rotatedAngle < maxDownAngle)
            {
                transform.RotateAround(targetModel.position, transform.right, (mouse_y * rotation_H_speed) + (maxDownAngle - rotatedAngle));
            }
            else if (rotatedAngle > maxUpAngle) //旋转角度大于85则设置85
            {
                transform.RotateAround(targetModel.position, transform.right, (mouse_y * rotation_H_speed) - (rotatedAngle - maxUpAngle));
            }
            else
            {
                transform.RotateAround(targetModel.position, transform.right, mouse_y * rotation_H_speed);
            }

        }

        // 平移
        if ( Input.GetMouseButton(0))
        {
            Vector3 pos = new Vector3(-Input.GetAxis("Mouse X") * move_H_speed, -Input.GetAxis("Mouse Y") * move_V_speed, 0f);
            float y = pos.y + transform.position.y;

            if (y > transMaxDown && y < transMaxUp)
            {
                this.transform.Translate(pos);
            }                          
        }    

    }

    public float CheckAngle(float value)
    {
        float angle = value - 180;


        if (angle > 0)
            return angle - 180;


        return angle + 180;
    }


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

posted @ 2022-02-11 11:16  Excel2016  阅读(634)  评论(0)    收藏  举报