C# 将精灵对象数组合并为一个精灵-Unity

C# 将精灵对象数组合并为一个精灵-Unity,c#,unity3d,textures,sprite,texture2d,C#,Unity3d,Textures,Sprite,Texture2d,我有一个统一的精灵对象数组。它们的大小取决于加载的图像。 我想把它们像平铺地图一样并排组合成一幅图像。 我希望它们的布局像你的照片一样,一个接一个地排成一行。(注意:不是一个在另一个之上) 我怎样才能做到这一点 我之所以合并(只是为了那些想知道的人)是因为我使用的是polygon2D对撞机。因为当我并排使用多个碰撞器时会发生一些奇怪的行为,所以我决定在添加一个大多边形碰撞器之前只合并图像。请注意,这些事情发生在运行时。我不能只是创建一个大图像并加载它,因为图像的顺序只在运行时确定 我希望在这方面

我有一个统一的精灵对象数组。它们的大小取决于加载的图像。 我想把它们像平铺地图一样并排组合成一幅图像。 我希望它们的布局像你的照片一样,一个接一个地排成一行。(注意:不是一个在另一个之上) 我怎样才能做到这一点

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

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

在Texture2D类中有,但由于它使您的atlas成为正方形,您无法生成一行精灵,因此有另一种方法可以通过读取图像像素并将其设置为新图像来实现,这在运行时非常昂贵,但会给您带来结果

// 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>();
}
//要组合的纹理
// !! 作为精灵导入后,更改为高级模式并启用读写属性!!
公共精灵[]纹理;
公共纹理2D图集;//只需在编辑器上查看,无需从编辑器中添加任何内容
公共材料试验材料;
公共喷洒器试验喷洒器;
int-textureWidthCounter=0;
int宽度、高度;
私有void开始(){
宽度=0;
高度=0;
foreach(纹理中的var t){
宽度+=t.texture.width;
如果(t.texture.height>height)
高度=t.纹理高度;
}
atlas=新纹理2D(宽度、高度、纹理格式RGBA32,假);
对于(int i=0;i
您是否尝试过仅合并碰撞器?这将是我的第一次尝试,因为它们似乎是问题所在。如果精灵相当简单,只需手动创建路径,如果不读取原始多边形碰撞器中的路径,将它们全部添加到新的或现有的多边形碰撞器中,然后删除其余的。@Tom我尝试过,但找不到合并碰撞器的方法。我写了一个代码,得到了所有的点,然后我删除了重复的点,我没有得到我想要的结果。当我看到它时,我意识到我需要找到一种确定有效路径的方法。我必须忽略关闭每个图像的路径。但是,当我的图像形状和大小不同(由许多点组成)时,我该怎么做?你能给我指出正确的方向/更好地帮助我吗。谢谢。根据从所有碰撞器获得的路径数,您可以只复制它们而不进行更改:一起计算所有碰撞器的路径数,然后将新碰撞器的路径数设置为该数字,然后循环所有路径,并使用SetPath()在新碰撞器中设置它们。我的猜测是,嗨,汤姆,难道所有的路径不都包括每个图像的闭合路径吗?每个路径本身都是闭合的,多边形碰撞器可以包含多个路径,所有路径都必须自己闭合(我不太确定你所说的闭合图像路径是什么意思)。但我认为,如果你没有遇到问题,nexx的答案可能更适合你的问题:)谢谢你。我会试试看。它会有多贵?它会极大地影响我的游戏性能吗?如果是的话,我想我会把它作为一个工具来使用,这样我就可以为我的对象生成多边形碰撞器,并将它保存为一个预置。但不管怎样,你都很棒。谢谢。保存为预置会更好。我认为,由于该方法使用n个立方嵌套循环,如果你正在制作大纹理,它可能会给你带来一些麻烦。你必须测试并找到最适合你的情况是的。我只是决定用它作为一个工具,并保存为预制。我注意到它不能创建大的纹理。但是,这起作用了,谢谢你。至少对我来说,创建多边形碰撞器会更容易。谢谢