Unity Sprite 切割图集并且获得任一子图(sprite/Texture)

首先,Unity中的Sprite Editor 可以将一张大图切割成多个sprite。然而如果想要从这么多切割好的子sprite获取某一个sprite 要如何操作呢?本篇文章总结了两个方法以获取图集中的某个子图。

一. 切割图集

  1. 这一步,使用Unity的SpriteEditor切割你的图集,如果不会使用SpriteEditor请参考这篇文章:Unity的2D图集处理,并切割出一张张小图片_0完美对称0的博客-CSDN博客_unity裁剪图片在我们找资源的时候,有时候会遇到那种把一堆图片放进一张png图片里面的情况,在做2D游戏的时候,我们往往需要将里面的一块块小图片切割出来使用,那么问题就来了,怎么切割呢,现在我们提供一张小图片,给大家演示一下:那么我们现在把图片导入到Unity中,选中图片你会看到左边的Inspector界面然后,选择Texture Type类型为Advanced,如下面左图:将Read/Wrihttp://blog.csdn.net/hongyouwei/article/details/45011315

二. 从切割好的图集中获取某一子图

1. 方法一:将切割好的sprite 转成 png 文件,并且存放在一个新建的文件夹中。然后使用一个List 记录这个文件夹中所有png文件的路径,需要返回哪一个图片,就通过AssetDatabase 来获取这一个图片。代码如下:

 //将分割好的sprite转换成Texture 并且返回一个texture文件 
    public static Texture2D GetChildTexture(Texture2D image, int num)
    {
        List<string> paths = new List<string>();//存放所有转化的png文件路径

        string rootPath = Path.GetDirectoryName(AssetDatabase.GetAssetPath(image));//获取路径名称  
        string path = rootPath + "/" + image.name + ".PNG";//图片路径名称  
        //Debug.Log(path);

        TextureImporter texImp = AssetImporter.GetAtPath(path) as TextureImporter;//获取图片入口  


        AssetDatabase.CreateFolder(rootPath, image.name);//创建文件夹

        foreach (SpriteMetaData metaData in texImp.spritesheet)//遍历小图集  
        {
            Texture2D myimage = new Texture2D((int)metaData.rect.width, (int)metaData.rect.height);


            //abc_0:(x:2.00, y:400.00, width:103.00, height:112.00)  
            for (int y = (int)metaData.rect.y; y < metaData.rect.y + metaData.rect.height; y++)//Y轴像素  
            {
                for (int x = (int)metaData.rect.x; x < metaData.rect.x + metaData.rect.width; x++)
                    myimage.SetPixel(x - (int)metaData.rect.x, y - (int)metaData.rect.y, image.GetPixel(x, y));
            }


            //转换纹理到EncodeToPNG兼容格式  
            if (myimage.format != TextureFormat.ARGB32 && myimage.format != TextureFormat.RGB24)
            {
                Texture2D newTexture = new Texture2D(myimage.width, myimage.height);
                newTexture.SetPixels(myimage.GetPixels(0), 0);
                myimage = newTexture;
            }

            var pngData = myimage.EncodeToPNG();
            string output_path = rootPath + "/" + image.name + "/" + metaData.name + ".PNG";//子图片输出路径
            File.WriteAllBytes(output_path, pngData); //输出子PNG图片

            paths.Add(output_path);

            // 刷新资源窗口界面  
            AssetDatabase.Refresh();
        }

        Texture2D output_image = AssetDatabase.LoadAssetAtPath<Texture2D>(paths[num]);
        Debug.Log(output_image.name);

        return output_image;
    }

2. 方法二: 直接获取切割好的sprite图集中的所有子sprite, 返回某一sprite。代码如下:

AssetDatabase.LoadAllAssetsAtPath(): 在编辑器模式下load 资源

Resources.LoadAll<T>() : 加载的资源必须放在Resources文件夹下

AssetBundle 动态加载资源的话,需要先给资源create AssetBundle, 然后再使用相关方法批量Load 资源。

//返回一个子sprite
    public static Sprite GetChildSprite(Texture2D image, int num)
    {

        string rootPath = Path.GetDirectoryName(AssetDatabase.GetAssetPath(image));//获取路径名称  
        string path = rootPath + "/" + image.name + ".PNG";//图片路径名称

        Object[] sprites = AssetDatabase.LoadAllAssetsAtPath(path);
        //Object[] sprites = Resources.LoadAll<Sprite>(path);


        Sprite output_sprite = (Sprite)sprites[num];

        Debug.Log(output_sprite.name);

        return output_sprite;
    }

三. 调用函数

可以扩展编辑器来调用GetChildTexture()的函数,因为这个方法涉及到在编辑器下转化sprite -> Texture。GetChildSprite() 方法会返回一个Sprite,具体情况具体分析。

[MenuItem("Assets/SpriteSlicer/SpriteSlice")]
    public static void SpliceSprite()
    {
        Texture2D input_image = Selection.activeObject as Texture2D;
        Texture2D output_image = GetChildTexture(input_image, 10);

        Sprite output_image2 = GetChildSprite(input_image,15);
    
    }

总结

本文探究了在Unity编辑器模式下如何切割图集,并且获得图集中的某一sprite。动态加载sprite需要使用AssetBundle加载,本文暂时并未实现,持续更新中。

* 使用了 using UnityEditor 的脚本只能发在Editor文件夹下。不然会有报错。

  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UnitySprite Multiple功能是用来处理多个图片在一个图集中的情况的。在使用这个功能之前,你需要准备一个包含多个小图的大图集。然后,你可以通过以下步骤来拆分这个图集。 首先,打开Unity编辑器,并将大图集导入到项目中。将图集拖拽到场景中的一个空的游戏对象上,创建一个Sprite Renderer组件。然后,将Sprite Mode设置为Multiple,这样unity就会把图集视为一个多精灵图。 接下来,点击Sprite Editor按钮,这会打开Sprite Editor窗口。在窗口中,你会看到图集中所有小图的预览。你可以使用鼠标选择并拖拽来选择一个小图,并在预览面板中预览选择的小图。 在Sprite Editor窗口的左侧,你可以调整小图的位置和大小,以确保它们正确地对应着图集中的位置。你还可以裁剪小图来确保只显示你想要的部分。你可以使用切分工具来裁剪小图,也可以使用设置工具来调整其精确位置和大小。 一旦你完成了所有的拆分和调整,点击Apply按钮来应用更改。此时,unity会自动创建一个Sprite Asset,它会将图集中的每个小图作为一个独立的精灵。 现在,你可以在Unity中使用这些独立的精灵了。你可以将它们分别用于不同的游戏对象,也可以使用Sprite Renderer组件的Sprite属性来动态更换精灵。 总的来说,UnitySprite Multiple功能非常方便,它使得管理和使用图集中的多个小图变得简单而高效。无论是制作2D游戏还是创建用户界面,都可以通过这个功能来提高工作效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值