这是我参与8月更文挑战的第20天,活动详情查看:8月更文挑战
概述
在项目开发中,有的时候需要将一张网上找到的Sprite图片资源进行切割,想要使用其中某一部分实用,或者是将图片切割作为拼图实用。这时候我们就需要使用图片切割功能,那么具体是如何实现的呢?让我们一起来看一下。
实现效果
实现过程
本文使用的Unity版本Unity2019.4.17。
将要切的图片放到Unity的Resources文件夹下,方便后面写程序的时候调用\
下面将正式开始内容学习。go!go!go!
一、导入Package包
想要进行图片切割,首先要2D Sprite
包安装到unity编辑器中,具体路径为Windows->Package Manager。在最上面的几个钟就有,找到之后点击右下角的Install进行安装即可
二、设置图片
导入进Unity中的图片类型一般都是Default
类型的,所以我们要把他改成Sprite(2D and UI)
如下
更改完图片类型之后,更改图片模式,将其更改为
Multiple
之后才能够进行图片切割
注意:重点的一步,一定要将图片设置为可读写的模式,在
Advanced
下的Read/Write Enabled
,这一项一定要勾选。
不要忘记点击
Applay
三、图片切割
在将图片类型和格式设置好之后,接下来就是要对图片隐形切割了,点击Sprite Editor
按钮对图片进行切割
打开切割界面之后会发现左上角有一个
Slice(切片)
按钮,点击按钮,在弹出小窗口中选择切割类型。
切割类型一共分为三种:
- Automatic:自动切割
- Grid By Cell Size:按照尺寸切割
- Grid By Cell Count:按照个数切割
在这里我们选择按照尺寸切割,第二个
我们来看一下如下界面,设置切割的每部分的长宽高以及间隔等参数,设置好之后点击
Slice
,进行图片切割下图中,箭头所指的就是切割线,还可以看到每一块的大小等参数,切割完之后,可以用鼠标拖动线框自定义调节切图大小
最后点击Apply进行保存,位置在右上角
保存完我们可以在Unity中看到,我们导入的图片已经分成了几个不同的小块,但是还需要将其分成单独独立的图片
四、编写代码将图片保存成独立图片
新建一个脚本,这里是通过[MenuItem("Tools/导出精灵")]
将代码写到了编辑器扩展里,用不到的小伙伴也可以不写,也可以直接在程序中调用。
通过Selection.objects
获取选中的图片,然后遍历,然后获取选中文件的路径,通过
Sprite[] sprites = Resources.LoadAll<Sprite>(loadPath);
将此文件下的所有资源(Sprite)获取到。
然后在创建一个输出(保存)文件夹
string outPath = Application.dataPath + "/outSprite/" + loadPath;
System.IO.Directory.CreateDirectory(outPath);
在之后遍历所有的Sprite,单独创建一个纹理,以及保存成Png格式的图片
foreach (Sprite sprite in sprites)
{
// 创建单独的纹理
Texture2D tex = new Texture2D((int)sprite.rect.width, (int)sprite.rect.height, sprite.texture.format, false);
tex.SetPixels(sprite.texture.GetPixels((int)sprite.rect.xMin, (int)sprite.rect.yMin,(int)sprite.rect.width, (int)sprite.rect.height));
tex.Apply();
// 写入成PNG文件
System.IO.File.WriteAllBytes(outPath + "/" + sprite.name + ".png", tex.EncodeToPNG());
}
到此所有的图片就保存到了单独的文件夹中,如下图所示
遇到的问题
1、报错如下
解决办法:
该问题就是图片的可读写没有打开,打开图片的可读写模式即可:
Advanced
下的Read/Write Enabled
2、报如下两个错误:
具体原因不是很清楚,大概应该是图片的格式不对,将图片格式改为RGBA 32 bit即可
源代码分享
GitHub地址:点击这里跳转下载
写在最后
所有分享的内容均为作者在日常开发过程中使用过的各种小功能点,分享出来也变相的回顾一下,如有写的不好的地方还请多多指教。欢迎大家相互学习进步。本片文章就先写到这里,希望对你能够有所帮助