c# - 统一。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;
}
}
}
解决方案
屏幕空间不同于世界空间
在 Unity 中,Input.MousePosition
以屏幕上的像素为单位进行测量。假设您有一台 1080p 显示器 - 1920 x 1080 - 这在当今很常见,这意味着Input.MousePosition
当您的游戏全屏时将在以下范围内:
- x:0 到 1919
- y: 0 到 1079
实际的世界单位——在你的场景中看到的单位——根本不重要,基本上可以是任何东西。
另一件值得注意的事是你的游戏世界是 3D 的,而物理屏幕是 2D 的。假设您的相机正在查看您世界中的开放空间,屏幕上的单个像素由 3D 世界中的无限线表示。这条线称为射线,您可以通过Camera.ScreenPointToRay将 2D 屏幕位置转换为射线,然后通过Physics.Raycast找到该线与哪些 3D 对象相交。
推荐阅读
- git - 无法验证签名证书或其链。证书科目
- r - 我们如何从 R 中的数据框中删除标签
- android - 如何设置textView不可点击
- jquery - 为什么我的数组在设置为输入值后会变成以“,”分隔的字符串?
- python - 尝试编写一个程序,在其中搜索单词中包含的字符串的所有单个字母
- javascript - javascript: onclick="scrollWin()" 不能按预期工作
- python-3.x - NameError:名称“face_cascade”未定义
- r - S3 方法:扩展 ggplot2 `+.gg` 函数
- ruby - 使用 Ruby 解析和显示 XML
- google-app-engine - 将防火墙添加到 IAP 保护的 App Engine 应用程序,其中成员:allUsers 被授予“IAP 保护的 Web 应用程序用户”