鼠标控制摄像机旋转,平移,物体的移动

 #region 点击物体移动
    public Camera ca;
    public GameObject DianjiObj;//点击到的物体
    Ray ray;//射线
    RaycastHit raycast;//射线返回的碰撞信息
    Vector3 StarMousePos;//一开始鼠标的位置
    Vector3 vector3;//要移动的距离
    Vector3 EndV3;
    #endregion
    #region 绕着物体旋转
    public Transform target;//声明一个观察目标  绕着这个物体旋转
    //旋转角度
    private float mx = 0.0f;
    private float my = 0.0f;
    //角度限制
    private float MinLimitY = -180;
    private float MaxLimitY = 180;
    //旋转速度
    public float SpeedX = 240;
    public float SpeedY = 120;
    //储存角度
    private Quaternion mRotation;
    //是否使用平滑差值  
    public bool isNeedDamping = true;
    //速度  
    public float DampingSpeed = 10F;
    //摄像机到物体的观察距离
    private float distance = 8f;
    //缩放视野
    public float minDistance = 2;
    public float maxDistance = 30;
    public float mSpeed = 10;
    #endregion
    #region 鼠标拖动平移相机视野
    public float MoveSpeed = 0.1f;
    #endregion
    //鼠标枚举
    private enum MouseButton
    {
        MouseButton_Lift=0,
        MouseButton_Right=1,
        MouseButton_Midle=2
    }
 void Start ()
    {
        //获取鼠标一开始的位置
        StarMousePos = Input.mousePosition;
        mx = transform.eulerAngles.x;
        my = transform.eulerAngles.y;
    }
 void Update ()
    {
        m_Move();
        m_Rotate();
        m_PingYI();
    }
    private void m_Move()//点击物体移动
    {
        if (Input.GetMouseButtonDown((int)MouseButton.MouseButton_Lift))
        {
            //把鼠标的世界坐标转化射线的屏幕发射位置
            ray = ca.ScreenPointToRay(Input.mousePosition);
            if (Physics.Raycast(ray,out raycast))
            {
                DianjiObj = GameObject.Find(raycast.transform.name);
            }
        }
        if (Input.GetMouseButton((int)MouseButton.MouseButton_Lift))
        {
            if (DianjiObj)
            {
                //获得物体的屏幕坐标
                Vector3 ObjPingMu = Camera.main.WorldToScreenPoint(DianjiObj.transform.position);
                //保存屏幕位置
                Vector3 ObjMouse = new Vector3(Input.mousePosition.x,Input.mousePosition.y, ObjPingMu.z);
                vector3 = Camera.main.ScreenToWorldPoint(ObjMouse) - DianjiObj.transform.position;
                EndV3 = vector3 + DianjiObj.transform.position;
                DianjiObj.transform.position = EndV3;
            }
        }
    }
    private void m_Rotate()//绕着物体旋转
    {
        if (target != null && Input.GetMouseButton((int)MouseButton.MouseButton_Right))
        {
            mx += Input.GetAxis("Mouse X") * SpeedX * 0.02f;
            my -= Input.GetAxis("Mouse Y") * SpeedY * 0.02f;
            my = ClampAngle(my, MinLimitY, MaxLimitY);
           
            
            Quaternion rotateAngle = Quaternion.Euler(my, mx, 0);//摄像机偏转角度 
            Vector3 disVector = new Vector3(0.0f, 0.0f, -distance);
            Vector3 position = rotateAngle * disVector + target.position;
            ////开始计算旋转
            mRotation = Quaternion.Euler(my, mx, 0);
            if (isNeedDamping)
            {
                transform.rotation = Quaternion.Lerp(transform.rotation, mRotation, Time.deltaTime * DampingSpeed);
                transform.position = Vector3.Lerp(transform.position, position, Time.deltaTime * DampingSpeed);
            }
            else
            {
                transform.rotation = mRotation;
                transform.position = position;
            }
        }
    }
    private void m_PingYI()
    {
        if(Input.GetAxis("Horizontal") != 0)
        {
            transform.Translate(Input.GetAxis("Horizontal") * MoveSpeed, 0, 0);
        }
        if (Input.GetAxis("Vertical") != 0)
        {
            transform.Translate(0, Input.GetAxis("Vertical") * MoveSpeed, 0);
        }
    }
    private float ClampAngle(float angle, float min, float max)
    {
        if (angle < -360)
        {
            angle += 360;
        }
        if (angle > 360)
        {
            angle -= 360;
        }
        return Mathf.Clamp(angle,min,max);
    }

猜你喜欢

转载自blog.csdn.net/vr851130674/article/details/78784538