获得精灵的宽度

时间:2014-05-08 07:23:05

标签: unity3d sprite game-engine

我正在尝试用我拥有的一些方形精灵创建一行。所以为了获得这些精灵的宽度,我正在使用

tileWidth = (int)tileSet[0].renderer.bounds.size.x;

然后形成我正在使用的行

for(int i = 0; i < tileSet.Length ; i++){
    if((i+1)*tileWidth<screenWidth){
        tileSet[i].transform.position = new Vector3(i*tileWidth,0,0);
    }
}

但精灵仍然相互重叠,并没有形成一个合适的行 我在这里做错了什么,我该如何纠正呢?

4 个答案:

答案 0 :(得分:15)

如果您使用的是Unity 5,则必须使用以下代码:

float tileWidth = tileSet[0].GetComponent<SpriteRenderer>().bounds.size.x;

您还必须注意Pixel Per Units值。

答案 1 :(得分:14)

如果精灵的分辨率为128x128像素 而这个精灵的Pixels To Units是100。

所以你的tileWidth将是:renderer.bounds.size.x = 128/100 = 1.28
但是你使用int:(int)renderer.bounds.size.x =(int)1.28 = 1
这就是你的精灵彼此重叠的原因。

float tileWidth = (float)tileSet[0].renderer.bounds.size.x;

答案 2 :(得分:0)

setTimeout()

答案 3 :(得分:0)

正如jjxtra指出的那样,Verv的答案不能正确处理旋转(MBehtemam的答案也不能正确处理,因为相同的答案只是稍作语法更新)。

以下扩展方法可以针对不同的正交摄影机尺寸,比例,旋转和纹理正确返回给定纹理的像素大小。

        public static Vector2 GetPixelSize(this SpriteRenderer spriteRenderer, Camera camera = null)
        {
            if (spriteRenderer == null) return Vector2.zero;

            if (spriteRenderer.sprite == null) return Vector2.zero;

            float pixelsPerUnit = spriteRenderer.sprite.pixelsPerUnit;

            // Get top left corner
            float offsetRight = spriteRenderer.sprite.rect.size.x / 2f / pixelsPerUnit;
            float offsetUp = spriteRenderer.sprite.rect.size.y / 2f / pixelsPerUnit;

            Vector2 localRight = Vector2.right * offsetRight;
            Vector2 localUp = Vector2.up * offsetUp;

            // Go to world
            Vector2 worldRight = spriteRenderer.transform.TransformPoint(localRight);
            Vector2 worldUp = spriteRenderer.transform.TransformPoint(localUp);
            Vector2 worldCenter = spriteRenderer.transform.position;

            // Go to pixels
            Vector2 coordsRight = GetPixelCoordinates(worldRight, camera);
            Vector2 coordsUp = GetPixelCoordinates(worldUp, camera);
            Vector2 coordsCenter = GetPixelCoordinates(worldCenter, camera);

            // Get sizes
            float pixelsRight = Vector2.Distance(coordsCenter, coordsRight);
            float pixelsUp = Vector2.Distance(coordsCenter, coordsUp);

            Vector2 itemSize = Vector2.right * pixelsRight * 2 + Vector2.up * pixelsUp * 2;

            return itemSize;
        }

        public static Vector2 GetPixelCoordinates(this Transform transform, Camera camera = null)
        {
            if (transform == null) return Vector2.zero;

            return GetPixelCoordinates(transform.position, camera);
        }

        private static Vector2 GetPixelCoordinates(Vector3 position, Camera camera)
        {
            if (camera == null)
                camera = Camera.main;

            if (camera == null) return Vector2.zero;

            return camera.WorldToScreenPoint(position);
        }