首页 > 解决方案 > 统一。Input.MousePosition 返回的坐标对于屏幕来说太大了

问题描述

我的相机中显示的最高 Y 位置是 5 和 -5。对于X,它是10。我正在制作一个塔防游戏,我希望塔在我购买它之后跟随我的鼠标位置,直到我点击轨道中的一个地方来建造/放置它。我很困惑,因为我根本看不到我的塔,但现在我意识到我的鼠标坐标很大。每个轴上最多有数百个。我的屏幕显然不适合那个。我什至尝试将矢量 2 中的鼠标位置除以 45 并进行偏移以使其适合。不幸的是,我必须根据屏幕大小更改值,这样就无法工作。我不知道这是否重要,但这是我的脚本?在从存储中实例化塔后调用此脚本。如果有帮助,商店按钮在画布中吗?也许画布就是为什么一切都关闭了?我如何解决它?

public class FrogBotPrefab : MonoBehaviour
{
    public frogbotshopscript shop;
    public canbuildManager buildingscript;
    public Vector2 mouseposition;
    public float xoffset;
    public float yoffset;
    // Start is called before the first frame update
    void Start()
    {
        xoffset = 9.55f;
        yoffset = 5.19f;
        shop = FindObjectOfType<frogbotshopscript>();
        buildingscript = FindObjectOfType<canbuildManager>();
    }

    // Update is called once per frame
    void Update()
    {
        mouseposition = Input.mousePosition/45;
        mouseposition.x -= xoffset;
        mouseposition.y -= yoffset;
        if (shop.followingmouse)
        {
         transform.position = mouseposition;
        }
        
    }
}

标签: c#unity3d

解决方案


屏幕空间不同于世界空间

在 Unity 中,Input.MousePosition以屏幕上的像素为单位进行测量。假设您有一台 1080p 显示器 - 1920 x 1080 - 这在当今很常见,这意味着Input.MousePosition当您的游戏全屏时将在以下范围内:

  • x:0 到 1919
  • y: 0 到 1079

实际的世界单位——在你的场景中看到的单位——根本不重要,基本上可以是任何东西。

另一件值得注意的事是你的游戏世界是 3D 的,而物理屏幕是 2D 的。假设您的相机正在查看您世界中的开放空间,屏幕上的单个像素由 3D 世界中的无限线表示。这条线称为射线,您可以通过Camera.ScreenPointToRay将 2D 屏幕位置转换为射线,然后通过Physics.Raycast找到该线与哪些 3D 对象相交。


推荐阅读