unity鼠标移动3d物体的三种方法

方法一:

利用ViewportToWorldPoint,把视口坐标转为世界坐标

        public void OnDrag(PointerEventData eventData)
        {
            Vector3 pos1 = Camera.main.ScreenToViewportPoint(Input.mousePosition);
            Vector3 pos2 = Camera.main.WorldToViewportPoint(transform.position);
            Vector3 pos = new Vector3(pos1.x, pos1.y, pos2.z);
            transform.position = Camera.main.ViewportToWorldPoint(pos);
        }

方法二:

利用ScreenToWorldPoint,把屏幕坐标转为世界坐标

        public void OnDrag(PointerEventData eventData)
        {
             //1:把物体的世界坐标转为屏幕坐标 (依然会保留z坐标)
            var currPosition = Camera.main.WorldToScreenPoint(transform.position);
            //2:更新物体屏幕坐标系的x,y
            currPosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, currPosition.z);
            //3:把屏幕坐标转为世界坐标
            var newPosition = Camera.main.ScreenToWorldPoint(currPosition);
            //4:更新物体的世界坐标
            transform.position = newPosition;
        }

方法三:

利用射线检测

        public void OnDrag(PointerEventData eventData)
        {
            //得到摄像机与物体所在平面的距离
            ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            //射线碰到了物体
            if (Physics.Raycast(ray, out hit))
            {
                transform.position = hit.point;
            }
        }

注意:方法三在一直点在一个物体上时,物体会不停靠近摄像机,直到贴脸。所以如果需要固定一个方向,比如Z值,或Y值。固定Y值时,物体沿地面移动,代码如下

            ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            //射线碰到了物体
            if (Physics.Raycast(ray, out hit, 100))
            {
                transform.position = new Vector3(hit.point.x, transform.position.y, hit.point.z);
            }

固定Z值时,物体上下左右移动,但改不了前后。

            ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            //射线碰到了物体
            if (Physics.Raycast(ray, out hit, 100))
            {
                transform.position = new Vector3(hit.point.x, transform.position.y, hit.point.z);
            }

版权声明:本文为qq_38893210原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。