unity COC风格像素完美级的鼠标拖拽镜头

 public class PanCamera : BaseCameraMovement
    {
        private Plane xzPlane;
        public Ray ray;
        private bool inTouch = false;
        private bool dragged = false;
        private Vector3 mousePosPrev = Vector3.zero;
        private Vector3 mousePosStart = Vector3.zero;
        private Vector3 vPickStart = Vector3.zero;
        private Vector3 vPickOld = Vector3.zero;
        private Vector3 vCamRootPosOld = Vector3.zero;
        private float DragCheckMin = 0.1f;
        private Vector3 CameraPanDir = Vector3.zero;


        public override void Init(Camera cam, Transform tran)
        {
            base.Init(cam, tran);
            xzPlane = new Plane(new Vector3(0f, 1f, 0f), 0f);
        }

        public override void CamUpdate()
        {
            Vector3 mousePosition = Input.mousePosition;
            this.ray = this.m_cam.ScreenPointToRay(mousePosition);
            float distance = default(float);
            if (Input.GetMouseButton(0))
            {
                if (UGUITools.IsPointerOverUIObject())
                {
                    return;
                }
                this.xzPlane.Raycast(this.ray, out distance);
                if (!this.inTouch)
                {
                    this.inTouch = true;
                    this.dragged = false;
                    this.mousePosPrev = (this.mousePosStart = mousePosition);
                    this.vPickStart = this.ray.GetPoint(distance) - this.m_tran.position;
                    this.vPickOld = this.vPickStart;
                    this.vCamRootPosOld = this.transform.position;
                }
                else if (Input.touchCount < 2)
                {
                    if (Vector3.Distance(mousePosition, this.mousePosStart) > DragCheckMin)
                    {
                        if (!this.dragged)
                        {
                            this.dragged = true;
                        }
                        if (Vector3.Distance(mousePosition, this.mousePosPrev) > this.DragCheckMin)
                        {
                            Vector3 a = this.ray.GetPoint(distance) - this.transform.position;
                            this.CameraPanDir = a - this.vPickStart;
                            this.SetCameraPosition(this.vCamRootPosOld - this.CameraPanDir);
                            this.vPickOld = a;
                        }
                    }
                    else if (this.dragged)
                    {
                        Vector3 a2 = this.ray.GetPoint(distance) - transform.position;
                        this.vPickOld = a2;
                    }
                    else if (!this.dragged)
                    {

                    }
                    this.mousePosPrev = mousePosition;
                }
            }
            else if (this.inTouch)
            {
                this.inTouch = false;
            }
        }

        public void SetCameraPosition(Vector3 vPos)
        {
            //if (this.borderType == BorderType.Rect)
            //{
            //    vPos.x = Mathf.Clamp(vPos.x, this.XMin, this.XMax);
            //    vPos.z = Mathf.Clamp(vPos.z, this.ZMin, this.ZMax);
            //}
            //else if (this.borderType == BorderType.Circle)
            //{
            //    Vector3 a = vPos;
            //    a.y = 0f;
            //    float magnitude = a.magnitude;
            //    if (magnitude > this.CircleBorderRadius)
            //    {
            //        a.Normalize();
            //        vPos = a * this.CircleBorderRadius;
            //    }
            //}
            this.m_tran.position = vPos;
        }
    }

补充说明:
不要介意BaseCameraMovement ,继承MonoBehavior就好
不要介意UGUITools.IsPointerOverUIObject()可以用其他检测鼠标是否点击UI来过滤

猜你喜欢

转载自blog.csdn.net/thrt520asd/article/details/82982078