Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Unity 4.3-了解位置和屏幕分辨率,如何正确设置对象的位置?_C#_Unity3d - Fatal编程技术网

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

C# Unity 4.3-了解位置和屏幕分辨率,如何正确设置对象的位置?,c#,unity3d,C#,Unity3d,在2d模式下使用Unity 4.3,我有一个游戏对象,它是一个精灵(在我设置精灵的Spirterender中),我试图将它定位在屏幕的左上角 我想让这个精灵在每个分辨率中都位于左上角(例如)(我把iOS作为构建目标,所以在我的例子中,我指的是iPhone的所有分辨率、视网膜、非视网膜、iPad等) 我缺少的是坐标系的工作原理,我习惯于在坐标系中使用像素,其中0,0从左下角或左上角开始 在Unity 4.3中,似乎0,0在中间(这显然不是一个大问题),但它让我困惑的是,如果我打印对象的宽度(128

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

我想让这个精灵在每个分辨率中都位于左上角(例如)(我把iOS作为构建目标,所以在我的例子中,我指的是iPhone的所有分辨率、视网膜、非视网膜、iPad等)

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

在Unity 4.3中,似乎0,0在中间(这显然不是一个大问题),但它让我困惑的是,如果我打印对象的宽度(128px),我得到的值是1.06,并且屏幕被细分为“点”,我想,因此左侧是-3,右侧是+3

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


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

您可能要注意的第一件事是,当您将图像作为纹理类型=精灵导入unity时,会在精灵资源上看到一个属性“像素到单位”

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

接下来,请注意正交摄影机的“大小”对应于其高度的一半

因此,在下图中,正交摄影机将看到白色框中的区域。尺寸5,表示10个单位高。我在场景中看到的一朵花的图片是一幅128像素宽96像素高的图像,以默认设置导入(1个单位=100像素)

现在我不确定您的确切用例是什么(也就是说,也许这是使用GuitTexture更好地解决的问题)。但是,假设您想要使用一个精灵,并且希望它的每一帧都位于左上角,并且希望该精灵始终以本机分辨率显示,那么下面的代码就可以做到这一点。将其添加到附加到精灵游戏对象的脚本中

// 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;        
}
//每帧调用一次更新
无效更新(){
浮动凸轮半高=Camera.main.orthographicSize;
浮动camHalfWidth=Camera.main.aspect*camHalfHeight;
Bounds Bounds=GetComponent().Bounds;
//将新向量设置到场景的左上角
Vector3 topLeftPosition=新Vector3(-camHalfWidth,camHalfHeight,0)+Camera.main.transform.position;
//按对象的大小对其进行偏移
topLeftPosition+=新向量3(bounds.size.x/2,-bounds.size.y/2,0);
transform.position=topLeftPosition;
}

您是否希望在场景中提供2D图形?如果是这样,则需要在正交投影中设置相机。完成后,可以指定视图矩阵,当Unity乘以矩阵时,将为您计算平截头体。尝试此论坛帖子:或此帖子:-虽然它们不是教程,但您应该能够从您最感兴趣的
camera.transform
中获取正交设置的代码。当您说“如果我打印对象的宽度”,您使用什么方法计算此宽度?我使用的是:myObject.GetComponent().bounds.size.xthanks,你的答案是正确的,一切都按照你说的进行,顺便说一句,图像正确为128px,现在我已经将“像素到单位”设置为100,正在打印正确的宽度。不再是1.06而是1.28!但我有一个小问题,我把5*128px的图像放在一个640x960分辨率的区域,但是5个正方形没有完全填满我用相机看到的宽度。。。5 x 128=640,这里怎么了?如果我从中间开始放置squadre,我会看到左边和右边都有一个边距,似乎相机渲染的区域宽度大于640,为什么?明白了,我必须将相机大小设置为4.8,现在它适合了!嗯,这对我不起作用。我的屏幕分辨率是800x450。如果我计算左上角的位置(相当于0,0的像素),我的精灵的位置太高,而且离左边有点太远。。。我错过了什么?我正在使用Unity.Hi@Kokodoko中最基本的教程设置。这应该行得通,(我想,如果在这个问题上没有投票的话)。请发布另一个问题,包括附加到游戏对象的源代码。你的评论中没有足够的信息让我来帮助你编辑,我看到您的问题得到了回答,为其他人链接: