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

22

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

我希望这个精灵在每个分辨率下都能位于左上方(例如,在iOS上构建目标,因此在我的情况下,我指的是iPhone所有分辨率,Retina,非Retina,iPad等)。

我不明白的是坐标系统的工作方式,我习惯于在从底部或顶部开始为0,0的坐标系统中使用像素。在Unity 4.3中,似乎0,0在中心(这显然不是什么大问题),但让我困惑的是,如果我打印对象的宽度(为128px),我得到1.06的值,并且屏幕被细分为“点”,所以左边是-3,右边是+3

所以问题是:为什么我的精灵宽度是1.06?如何在此系统内完美地定位物体?

假设我想要将一个128px * 128px的正方形正好放置在左上角,我该怎么做?


你是否想在场景中提供2D图形?如果是这样,您需要设置正交投影相机。一旦完成设置,您可以指定视图矩阵,当Unity乘以您的矩阵时,截锥体将为您计算。尝试查看这个论坛帖子:http://forum.unity3d.com/threads/128138-how-do-i-setup-an-orthographic-view 或者这个:http://answers.unity3d.com/questions/28533/how-to-properly-set-up-quad-positions-for-2d-with.html - 虽然它们不是教程,但您应该能够从中获取正交设置的代码。 - Charleh
你最感兴趣的是 camera.transform - Charleh
当你说“如果我打印对象的宽度”,你使用什么方法来计算这个宽度? - ardrian
我正在使用这个:myObject.GetComponent<SpriteRenderer>().bounds.size.x - Adarkuccio
1个回答

38

你需要注意的第一件事是,当你将一张图片以 Sprite 的方式导入 Unity 时,会出现一个 "Pixels To Units" 属性,可在精灵资源上看到。

enter image description here

如果你按默认设置留下你的128像素,它将会是1.28个“单位”宽。然而,这个值与你的1.06度量不符,所以我不确定它从哪里来。这可能是因为你的精灵对象比例尺不一致,也可能是因为你的 "Pixels To Units" 设置被修改了。请仔细检查检查器中的输入纹理是否真正为128x128,并检查Pixel to Units值是否符合你的期望。

其次,请注意正交摄像机的“大小”对应于其高度的一半。

因此,在下面的图像中,正交相机将看到白色框中的区域。大小5意味着10个单位的高度。我场景中的花的图片是一个128像素宽96像素高的图像,按默认设置导入(1单位=100像素)。

enter image description here

现在我不确定你的确切用例是什么(即可能最好使用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!但是我有一个小问题,我在640x960分辨率区域中放置了5个128像素的图像,但是这5个正方形并没有完全填满我在相机中看到的宽度... 5 x 128 = 640,这里出了什么问题?如果我从中心开始放置我的正方形,我会看到左右两侧有一个边距,似乎相机正在呈现比640更宽的区域,为什么? - Adarkuccio
明白了,我必须将相机大小设置为4.8,现在它适合得很好! - Adarkuccio
嗯,这对我不起作用。我的屏幕分辨率是800x450。如果我计算左上角位置(相当于0,0的像素),我的精灵位置太高了,而且有点太靠左了...我错过了什么吗?我正在使用Unity中最基本的教程设置。 - Kokodoko
嗨@Kokodoko。这应该可以工作(我假设,鉴于此问题的赞数)。请发布另一个问题,并包括附加到GameObject的源代码。您的评论中没有足够的信息让我帮助您。-编辑,我看到您的问题已得到解答,为其他人提供链接:http://stackoverflow.com/a/31117334/2770333 - ardrian

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