将精灵对象数组合并为一个精灵-统一

本文关键字:精灵 一个 统一 对象 数组 合并 | 更新日期: 2023-09-27 18:19:59

我在Unity中有一个Sprite对象数组。它们的大小因加载的图像而异。我想把它们像平铺的地图一样并排组合成一个图像。我希望它们的布局就像你正在形成一排又一排的图像一样。(注意:不要一个在另一个上面)我怎样才能做到这一点?

我之所以组合(只是为了那些想知道的人)是因为我使用的是polygon2D对撞机。由于当我并排使用多个对撞机时会发生一些奇怪的行为,我决定在添加一个大的多边形对撞机之前先组合图像。请注意,这些事情发生在运行时。我不能只创建一个大图像并加载它,因为图像的顺序只在运行时确定。

我希望在这方面能得到一些帮助。谢谢

将精灵对象数组合并为一个精灵-统一

Texture2D类中有PackTextures方法,但由于它使图谱呈正方形,因此无法制作一行精灵,因此还有另一种方法可以通过读取图像像素并将其设置为新图像来实现,因此在运行时执行此操作确实很昂贵,但会给您带来结果。

// Your textures to combine
// !! After importing as sprite change to advance mode and enable read and write property !!
public Sprite[] textures;
public Texture2D atlas;    // Just to see on editor nothing to add from editor
public Material testMaterial;
public SpriteRenderer testSpriteRenderer;
int textureWidthCounter = 0;
int width,height;
private void Start () {
    width = 0;
    height = 0;
    foreach(var  t in textures) {
        width += t.texture.width;
        
        if (t.texture.height > height)
            height = t.texture.height;
    }
    
    atlas = new Texture2D(width,height, TextureFormat.RGBA32,false);
    
    for (int i = 0; i < textures.Length; i++)
    {
        int y = 0;
        while (y < atlas.height) {
            int x = 0;
            while (x < textures[i].texture.width ) {
                if (y < textures[i].texture.height) 
                     atlas.SetPixel(x + textureWidthCounter, y, textures[i].texture.GetPixel(x, y));  // Fill your texture
                else atlas.SetPixel(x + textureWidthCounter, y,new Color(0f,0f,0f,0f));  // Add transparency
                x++;
            }
            y++;
        }
        atlas.Apply();
        textureWidthCounter +=  textures[i].texture.width;
    }
    
    // For normal renderers
    if (testMaterial != null)
        testMaterial.mainTexture = atlas;
    // for sprite renderer just make  a sprite from texture
    var s = Sprite.Create(atlas, new Rect(0f, 0f, atlas.width, atlas.height), new Vector2(0.5f, 0.5f));
    testSpriteRenderer.sprite = s;
    // add your polygon collider
    testSpriteRenderer.gameObject.AddComponent<PolygonCollider2D>();
}