在Unity 2D中如何处理坐标系和游戏屏幕?

18

我之前在其他平台上开发游戏时,x / y坐标系对我来说是有意义的。左上角代表游戏屏幕,坐标为(0,0),右下角坐标为(width,height)。现在我正在尝试跳到Unity 2d,但我不明白游戏屏幕如何工作。如果我在屏幕上放置了背景和角色对象,则当我移动角色时,他的x和y值在-3和3之间变化...非常小的坐标,并且与我设置的游戏分辨率(1024x768)不匹配。有没有好的教程可以理解Unity中的游戏网格?或者有人可以解释一下我如何实现我想做的事情吗?

2个回答

21
在Unity中有三种坐标系:屏幕坐标、视图坐标和世界坐标。 世界坐标:将场景中的对象用“点”来进行绝对定位。你可以选择让单位代表任何你想要表示的长度,例如1个单位=10米。屏幕上显示的内容由摄像机的位置和方向决定。 视图坐标:给定相机视口中的坐标。视口是虚拟矩形,通过它可以查看世界。这些坐标是比例关系,并且范围从(0,0)到(1,1)。 屏幕坐标:实际像素坐标,表示设备屏幕上的位置。
请注意,任何给定对象的世界坐标永远不会因为使用哪个相机进行查看而改变,而视图坐标则取决于所使用的相机。此外,屏幕坐标还取决于设备的分辨率以及相机视图在屏幕上的放置位置。
“Camera”对象提供了几种方法在这些不同的坐标系之间进行转换,如“ScreenToViewportPoint”、“ScreenToWorldPoint”等。 示例:将对象放置在屏幕左上角
    float distanceFromCamera = 10.0f;
    Vector3 pos = Camera.main.ScreenToWorldPoint (new Vector3 (0, Camera.main.pixelHeight, distanceFromCamera));

    transform.position = pos;
ScreenToWorldPoint 函数需要一个 Vector3 作为参数,其中 x 和 y 表示屏幕上的像素位置(0,0 表示左下角),而 z 分量表示所需距相机的距离。无限数量的 3D 位置可以映射到相同的屏幕位置,因此您需要提供这个值。 请确保所需位置位于摄像机的裁剪区域内。此外,根据您希望以左上角为中心进行对齐的对象部分,您可能需要选择适当的枢轴点。

但是如何在它们之间进行转换呢?例如,如果我想将我的游戏对象放置在屏幕的左上角,该怎么办? - Kokodoko
1
@Kokodoko,请查看更新后的答案;示例回答了您的问题。 - sonofrage
谢谢。我现在明白了,相机到Z轴的距离导致了意外的结果。我仍然不明白为什么一个2D游戏需要这个,但至少它现在可以工作了! - Kokodoko
每个相机都有“近裁剪”和“远裁剪”距离,即使是在2D模式下使用的正交相机也是如此。任何比近裁剪更近或比远裁剪平面更远的东西都不会被渲染。在2D情况下,您只需要确保对象位于此范围内,它将以相同的大小显示,无论与相机的距离如何。在3D情况下,您放置对象的距离越远,它就会变得越小。 - sonofrage

4

使用:

Camera.main.WorldToScreenPoint (transform.position);

这使我可以将我的游戏对象的位置转换为屏幕的x和y坐标系。


你能提供一个在游戏屏幕的左上角放置物体的例子吗?(视图?)我正在使用2D空间。 - Kokodoko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接