Unity 拖动脚本

public class ObjDrag : MonoBehaviour {

    // Use this for initialization
    void Start () {
        
    }
    
    // Update is called once per frame
    void Update () {
        
    }
    Vector3 MyScreenPointToWorldPoint(Vector3 ScreenPoint, Transform target)
    {
        //1 得到物体在主相机的xx方向
        Vector3 dir = (target.position - Camera.main.transform.position);
        //2 计算投影 (计算单位向量上的法向量)
        Vector3 norVec = Vector3.Project(dir, Camera.main.transform.forward);
        //返回世界空间
        return Camera.main.ViewportToWorldPoint
            (
               new Vector3(
                   ScreenPoint.x / Screen.width,
                   ScreenPoint.y / Screen.height,
                   norVec.magnitude
               )
            );

    }
    Vector3 startPos;
    Vector3 endPos;
    Vector3 offset; 

    private void OnMouseDown()
    {
        //记录起始位置
        //因为我们的物体cube所处的是世界空间 鼠标是屏幕空间
        //需要将鼠标的屏幕空间转换成世界空间
        startPos = MyScreenPointToWorldPoint(Input.mousePosition, transform);
    }

    private void OnMouseDrag()
    {
        endPos = MyScreenPointToWorldPoint(Input.mousePosition, transform);
        //计算偏移量
        offset = endPos - startPos;
        //让cube移动
        transform.position += offset;
        //这一次拖拽的终点变成了下一次拖拽的起点  
        startPos = endPos;
    }
    //void OnMouseDown()
    //{
    //    StartCoroutine(Move());
    //}
    //IEnumerator Move()
    //{
    //    var screenSpace = Camera.main.WorldToScreenPoint(transform.position);//三维物体坐标转屏幕坐标
    //                                                                         //将鼠标屏幕坐标转为三维坐标,再算出物体位置与鼠标之间的距离
    //    var offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z));
    //    //print("down");
    //    while (Input.GetMouseButton(0))
    //    {
    //        //print("button0");
    //        var curScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z);
    //        var curPosition = Camera.main.ScreenToWorldPoint(curScreenSpace) + offset;
    //        transform.position = curPosition;
    //        yield return null;//这个很重要,循环执行
    //    }
    //}
}

 

posted @ 2019-07-24 16:06  大刀乱飞  阅读(301)  评论(0)    收藏  举报