Hello World

整体代码

    IEnumerator OnMouseDown()
    {
        //1. 得到物体的屏幕坐标
        cubeScreenPos = Camera.main.WorldToScreenPoint(transform.position);

        //2. 计算偏移量
        //鼠标的三维坐标
        Vector3 mousePos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, cubeScreenPos.z);  //最后的那个是距离,距离XY平面的距离的平面 
        //鼠标三维坐标转为世界坐标
        mousePos = Camera.main.ScreenToWorldPoint(mousePos);
        offset = transform.position - mousePos;  //因为平面距离相等,
        // 鼠标实际位置与物体位置中心的偏移量,保证一致


        //3. 物体随着鼠标移动
        while (Input.GetMouseButton(0))
        {
            //目前的鼠标二维坐标转为三维坐标
            Vector3 curMousePos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, cubeScreenPos.z);
            //目前的鼠标三维坐标转为世界坐标
            curMousePos = Camera.main.ScreenToWorldPoint(curMousePos);

            //物体世界位置
            transform.position = curMousePos + offset;
            yield return new WaitForFixedUpdate(); //这个很重要,循环执行
        }
    }
}

参考文献:
https://blog.csdn.net/fenglele_fans/article/details/77879448
https://jingyan.baidu.com/article/fa4125ac032ad228ac709216.html
https://blog.csdn.net/a380331382/article/details/84069477
https://www.jianshu.com/p/65d7d64f9314

主要步骤

得到物体屏幕坐标的Z值
物体由世界坐标转为屏幕坐标
得到鼠标的世界坐标(Z值是物体的屏幕坐标)
鼠标三维屏幕坐标从屏幕坐标转为世界坐标
计算摄像机与物体的偏移量
都是世界坐标下,计算鼠标世界坐标与物体世界坐标的偏移值
循环判断是否按鼠标左键
按键后,得到当前的鼠标世界坐标
物体世界坐标 = 目前当前的世界坐标 + 偏移值
注意:
要用while循环
要用协程
要yield return new WaitForFixedUpdate()
在Start方法中调用StartCoroutine(要调用的协程方法)
此脚本要挂载在要实现此功能的物体上
要调用OnMouseDown方法

作者:Joe_Game
链接:https://www.jianshu.com/p/65d7d64f9314
来源:简书

Camera.ScreenToWorldPoint

如何转换?假如给定一个所谓的屏幕坐标(x,y,z),如何将其转换为世界坐标?

首先,我们要理解摄像机是如何渲染物体的:

摄像机对游戏世界的渲染范围是一个平截头体,渲染边界是一个矩形,用与near clippingplane或者far clippingplane平行的平面截取这个平截头体,可以获得无数个平行的矩形面,也就是我们看到的屏幕矩形。离摄像机越远,矩形越大,离摄像机越近,矩形越小。所以,同样大小的物体,随着离摄像机越来越远,相对于对应屏幕矩形就越来越小,所看起来就越来越小。

在屏幕上,某个像素点相对于屏幕矩形的位置,可以对应于游戏世界中的点相对于某个截面的位置,关键在于这个点在哪个截面上,也就是说,关键在于这个截面离摄像机有多远!

在ScreenToWorldPoint这个方法中,参数是一个三维坐标,而实际上,屏幕坐标只能是二维坐标。参数中的z坐标的作用就是:用来表示上述平面离摄像机的距离。

也就是说,给定一个坐标(X,Y,Z),

首先截取一个垂直于摄像机Z轴的,距离为Z的平面P,这样不管X,Y怎么变化,返回的点都只能在这个平面上;

然后,X,Y表示像素坐标,根据(X,Y)相对于屏幕的位置,得到游戏世界中的点相对于截面P的位置,我们也就将屏幕坐标转换为了世界坐标。


好好学习,天天向上

标签: C#

添加新评论