[Unity] Input.mousetion 屏幕坐标转世界坐标

371 阅读1分钟

一、代码如下:

        Vector3 screenPos = Input.mousePosition;
        screenPos.z = 5.0f;
        Vector3 p1 = Camera.main.ScreenToWorldPoint(screenPos);
        Vector3 p0 = Camera.main.transform.position;
        float h2 = 0.0f - p0.z;
        float h1 = p1.z - p0.z;
        Vector3 dir = p1 - p0;
        dir.z = 0.0f;
        float d1 = dir.magnitude;
        float d2 = d1 * h2 / h1;
        Vector3 p2 = p0 + dir.normalized * d2;
        p2.z = 0;

二、原理

image.png

三、项目应用场景

鼠标在屏幕上点击某一块网格,将点击后的屏幕坐标返回世界坐标,返回了世界坐标我们才能在画布中显示对应的功能

 private void Update()
    {
        if(Input.GetMouseButtonDown(0))
        {
            Debug.Log("返回的点"+GetGridPointByMouse());
        }
    }
    
public Vector2 GetGridPointByMouse()
    {
        Vector3 screenPos = Input.mousePosition;
        screenPos.z = 5.0f;
        Vector3 p1 = Camera.main.ScreenToWorldPoint(screenPos);
        Vector3 p0 = Camera.main.transform.position;
        float h2 = 0.0f - p0.z;
        float h1 = p1.z - p0.z;
        Vector3 dir = p1 - p0;
        dir.z = 0.0f;
        float d1 = dir.magnitude;
        float d2 = d1 * h2 / h1;
        Vector3 p2 = p0 + dir.normalized * d2;
        p2.z = 0;
        return GetGridPointByWorldPos(p2);
    }
    
    public Vector2 GetGridPointByWorldPos(Vector2 worldPos)
    {
        float dis = 1000000;//起初记录一个最大值,保证可以进入循坏,后期可以进行再次改变
        Vector2 point = new Vector2(); //point用来记录最终要返回网格点
        for (int i = 0; i < gridList.Count; i++)
        {
            if (Vector2.Distance(worldPos, gridList[i].Position) < dis)
            {
                dis = Vector2.Distance(worldPos, gridList[i].Position);
                point = gridList[i].Position;
            }
        }
        return point;
    }

直接到转化后的世界坐标p2进行传入或者处理即可。

参考文档:blog.csdn.net/qq302756113…