在 Unity 2d 中使用坐标系和游戏屏幕?
Posted
技术标签:
【中文标题】在 Unity 2d 中使用坐标系和游戏屏幕?【英文标题】:Working with the coordinate system and game screen in Unity 2d? 【发布时间】:2014-02-21 14:48:14 【问题描述】:所以我在 x/y 坐标系对我来说有意义的其他平台上开发了游戏。左上角代表游戏画面,坐标为 (0,0),右下角为 (width,height)。现在我正在尝试跳转到 Unity 2d,但我无法理解游戏屏幕是如何工作的。如果我在屏幕上有一个背景对象和一个角色对象,当我围绕他的 x 和 y 值移动角色时,他的 x 和 y 值在 -3 和 3 之间变化......非常小的坐标并且它与我设置的游戏分辨率不匹配( 1024x768)。有没有很好的教程来理解 Unity 中的游戏网格?或者谁能解释我如何才能完成我想做的事情?
【问题讨论】:
【参考方案1】:Unity中有三种坐标系:屏幕坐标、视图坐标和世界坐标。
世界坐标:考虑场景中对象的绝对定位,使用“点”。您可以选择让单位表示您想要的任何长度,例如 1 个单位 = 10 米。屏幕上实际显示的内容取决于相机的放置位置和方向。
查看坐标:给定相机的视口中的坐标。视口是观察世界的假想矩形。这些坐标是比例坐标,范围从 (0,0) 到 (1,1)。
屏幕坐标:表示设备屏幕上位置的实际像素坐标。
请注意,任何给定对象的世界坐标将始终相同,无论使用哪个相机进行查看,而视图坐标取决于所使用的相机。屏幕坐标还取决于设备的分辨率和相机视图在屏幕上的位置。
“Camera”对象提供了多种方法来在这些不同的坐标系之间进行转换,例如“ScreenToViewportPoint”“ScreenToWorldPoint”等。
示例:将对象放在屏幕左上角
float distanceFromCamera = 10.0f;
Vector3 pos = Camera.main.ScreenToWorldPoint (new Vector3 (0, Screen.height, distanceFromCamera));
transform.position = pos;
ScreenToWorldPoint
函数将 Vector3 作为参数,其中 x 和 y 表示屏幕上的像素位置(0,0 是左下角),z 分量表示与相机的所需距离。无限数量的 3D 位置可以映射到相同的屏幕位置,因此您需要提供此值。
只需确保所需位置位于相机的剪辑区域内即可。此外,您可能需要为对象选择合适的轴心,具体取决于您希望对象的哪个部分位于左上角的中心。
【讨论】:
但是如何在它们之间转换呢?例如,如果我想将我的游戏对象放在屏幕的左上角怎么办? @Kokodoko 请查看更新后的答案;该示例回答了您的问题。 谢谢。我现在看到与相机的 Z 距离产生了意想不到的结果。我仍然对为什么 2D 游戏需要这个感到困惑,但至少它可以工作! 每个摄像机都有一个“近剪辑”和一个“远剪辑”距离,即使是您在 2D 模式下使用的正交摄像机。任何比近剪辑更近或比远剪辑平面更远的东西都不会被渲染。在 2D 的情况下,您只需要确保对象在此范围内,无论与相机的距离如何,它都会显示相同的大小。在 3D 的情况下,对象放置得越远,它就会显得越小。【参考方案2】:使用:
Camera.main.WorldToScreenPoint(transform.position);
让我将我的 GameObjects 转换位置转换为屏幕的 x 和 y 坐标系
【讨论】:
你能举例说明如何在游戏屏幕的左上角放置一个对象吗? (查看?)我在二维空间中工作。以上是关于在 Unity 2d 中使用坐标系和游戏屏幕?的主要内容,如果未能解决你的问题,请参考以下文章
100个 Unity实用技能| Unity InputSystem中拿到触摸屏幕的坐标,鼠标的坐标等
100个 Unity实用技能☀️ | Unity InputSystem中拿到触摸屏幕的坐标,鼠标的坐标等