Unity 4.3 - 了解位置和屏幕分辨率,如何正确设置对象的位置?

Posted

技术标签:

【中文标题】Unity 4.3 - 了解位置和屏幕分辨率,如何正确设置对象的位置?【英文标题】:Unity 4.3 - understanding positions and screen resolution, how to properly set position of object? 【发布时间】:2014-04-30 21:43:05 【问题描述】:

在 2d 模式下使用 Unity 4.3 我有一个游戏对象,它是一个精灵(在 SpriteRenderer 中我设置了精灵),我试图将它定位在屏幕的左上角。

我想让这个精灵在每个分辨率中都位于左上角(例如)(我有 ios 作为构建目标,所以在我的情况下,我说的是 iPhone 所有分辨率,视网膜,非视网膜, iPad 等)。

我缺少的是坐标系的工作原理,我习惯于使用坐标系中的像素,其中 0,0 从左下角或左上角开始。

在 Unity 4.3 中,0,0 似乎在中心(这显然不是一个大问题),但让我感到困惑的是,如果我打印对象的宽度(即 128 像素),我会得到一个1.06 作为值,我想屏幕也细分为“点”,所以左边是-3,右边是 +3

所以问题是:为什么我的精灵宽度是 1.06 ?我应该如何在这个系统中完美定位?

假设我想在左上角准确定位一个 128px*128px 的正方形,我该怎么做?

【问题讨论】:

您是否正在考虑在您的场景中提供 2D 图形?如果是这样,您需要在正交投影中设置相机。完成后,您可以指定视图矩阵,当 Unity 将您的矩阵相乘时,将为您计算截锥体。试试这个论坛帖子:forum.unity3d.com/threads/… 或这个:answers.unity3d.com/questions/28533/… - 虽然它们不是教程,但你应该能够从中获取正交设置的代码 您对camera.transform最感兴趣 当你说'如果我打印我的对象的宽度'时,你用什么方法来计算这个宽度? 我正在使用这个:myObject.GetComponent().bounds.size.x 【参考方案1】:

您可能要注意的第一件事是,当您将图像导入统一为 Texture Type = Sprite 时,有一个属性“Pixels To Units”,您将在 sprite 资产上看到该属性。

因此,如果保留默认设置,您的 128 像素将是 1.28“单位”宽。但是,此值与您的 1.06 测量值不对应,因此我不确定它来自何处。这可能是因为您的精灵对象的比例不统一,也可能是因为您的“像素到单位”设置已被修改。在检查器中仔细检查您的输入纹理实际上是 128x128,并检查 Pixel to Units 值是否符合您的预期。

接下来,请注意正交相机的“尺寸”对应于其高度的一半。

所以在下图中,正射相机将看到白框中的区域。尺寸 5,意味着 10 个单位高。我在场景中的花朵图片是 128 像素宽 x 96 像素高的图像,以默认设置导入(1 个单位 = 100 像素)。

现在我不确定您的确切用例是什么(即,也许这是使用 GUITexture 更好地解决的问题)。但是,假设您要使用 Sprite,并且您希望它位于左上角的每一帧,并且您希望该 sprite 始终以本机分辨率显示,那么以下代码将执行此操作。将其添加到附加到 Sprite 游戏对象的脚本中。

// Update is called once per frame
void Update () 
    float camHalfHeight = Camera.main.orthographicSize;
    float camHalfWidth = Camera.main.aspect * camHalfHeight; 

    Bounds bounds = GetComponent<SpriteRenderer>().bounds;

    // Set a new vector to the top left of the scene 
    Vector3 topLeftPosition = new Vector3(-camHalfWidth, camHalfHeight, 0) + Camera.main.transform.position; 

    // Offset it by the size of the object 
    topLeftPosition += new Vector3(bounds.size.x / 2,-bounds.size.y / 2, 0);

    transform.position = topLeftPosition;        

【讨论】:

谢谢,你的答案是正确的,一切都如你所说,顺便说一下,图像是正确的 128 像素,现在我已经将“像素到单位”设置为 100 正在打印正确的宽度。不再是 1.06 而是 1.28 !但我有一个小问题,我将 5 * 128px 图像放在 640x960 res 区域中,但是 5 个正方形并没有完全填满我用相机看到的宽度...... 5 x 128 = 640,这里有什么问题?如果我让我的小队从中心开始,我会在左右两边看到一个边距,似乎相机正在渲染一个宽度大于 640 的区域,为什么? 明白了,我必须将相机尺寸设置为 4.8,现在可以正常使用了! 嗯,这对我不起作用。我的屏幕分辨率是 800x450。如果我计算左上角的位置(相当于 0,0 的像素),我的精灵位置太高了,而且离左边有点太远了……我错过了什么?我正在使用 Unity 中最基本的教程设置。 嗨@Kokodoko。这应该可行,(我假设,鉴于对这个问题的赞成票)。请发布另一个问题并包含附加到游戏对象的源代码。您的评论中没有足够的信息让我帮助您。 - 编辑,我看到你的问题得到了回答,为其他人链接:***.com/a/31117334/2770333

以上是关于Unity 4.3 - 了解位置和屏幕分辨率,如何正确设置对象的位置?的主要内容,如果未能解决你的问题,请参考以下文章

Unity 3D 屏幕适配全方面解析!

Unity高级开发-项目与屏幕适配

Unity 4.3 2d 以编程方式创建 Sprite

Unity 手机屏幕适配

Unity3D-关于项目的屏幕适配(看我就够了)

Unity 3D手游对不同分辨率屏幕的UI自适应