Unity ShoeBox Extract Sprites 到 Unity 格式

为一张透明的图片进行切割


可以使用 ShoeBox 的  Extract Sprites 功能,将图片拖动到 Extract Sprites 功能图标上,就会自动切割好图片,如下图所示:

点击  Settings 可以进行详细设置,这里将 Clusters Merge Sub Items 设为 false,不合并子项,将 File Name 改成 slice##.png,点击  Apply 即可。然后按  Save 就可以导出切割好的图片。如下图所示:

生成包括一个文本文档,记录每张切割的子图坐标。在 Unity 的 Editor 目录下,添加如下脚本:
 C# Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
using System.Collections.Generic;
using System.Reflection;
using UnityEditor;
using UnityEngine;
using System.IO;

/// <summary>
/// 处理ShoeBox切割的图片到Sprites
/// </summary>
public  class ShoeBoxExtractSpritesImport
{
    [MenuItem( "Assets/ShoeBox/Process to Sprites")]
     static  void ProcessExtractSpritesToSprites()
    {
        TextAsset txt = Selection.activeObject  as TextAsset;
         if (txt ==  null)
        {
            Debug.LogError( "Must be .txt file!");
             return;
        }
         string assetPath = AssetDatabase.GetAssetPath(txt);
         if (Path.GetExtension(assetPath) !=  ".txt")
        {
            Debug.LogError( "Must be .txt file!");
             return;
        }

         string rootPath = Path.GetDirectoryName(assetPath);
         string path = rootPath +  "/" + Path.GetFileNameWithoutExtension(assetPath);
        TextureImporter texImp = AssetImporter.GetAtPath(path)  as TextureImporter;
         if (texImp ==  null)
        {
             return;
        }

         object[] args =  new  object[ 2] {  00 };
        MethodInfo mi =  typeof(TextureImporter).GetMethod( "GetWidthAndHeight", BindingFlags.NonPublic | BindingFlags.Instance);
        mi.Invoke(texImp, args);

        var height = ( int)args[ 1];
        List<SpriteMetaData> sprites = GetSpriteMetaDatas(rootPath, txt.text, height);

        texImp.spritesheet = sprites.ToArray();
        texImp.textureType = TextureImporterType.Sprite;
        texImp.spriteImportMode = SpriteImportMode.Multiple;

        AssetDatabase.DeleteAsset(assetPath);
        AssetDatabase.ImportAsset(path);
    }

     static List<SpriteMetaData> GetSpriteMetaDatas( string path,  string text,  int totalHeight)
    {
        List<SpriteMetaData> sprites =  new List<SpriteMetaData>();
        var sliceName =  "slice";
        var arrayTxt = text.Split( ',');
        var pngIndex =  0;
         foreach (var txt  in arrayTxt)
        {
            var arrayPoint = txt.Split( ' ');

             int x =  int.Parse(arrayPoint[arrayPoint.Length -  2]);
             int y =  int.Parse(arrayPoint[arrayPoint.Length -  1].TrimEnd( '.'));

            pngIndex++;
            var pngName = sliceName + pngIndex.ToString().PadLeft( 2'0') +  ".png";
            var pngPath = path +  "/" + pngName;
            TextureImporter importer = AssetImporter.GetAtPath(pngPath)  as TextureImporter;

             if (importer !=  null)
            {
                 object[] args =  new  object[ 2] {  00 };
                MethodInfo mi =  typeof(TextureImporter).GetMethod( "GetWidthAndHeight", BindingFlags.NonPublic | BindingFlags.Instance);
                mi.Invoke(importer, args);

                var width = ( int)args[ 0];
                var height = ( int)args[ 1];

                SpriteMetaData smd =  new SpriteMetaData();
                smd.rect =  new Rect(x, totalHeight - y - height, width, height);
                smd.alignment =  0;
                smd.name = pngName.Remove(pngName.Length -  4);
                smd.pivot =  new Vector2( 0.5f,  0.5f);
                sprites.Add(smd);

                AssetDatabase.DeleteAsset(pngPath);
            }
        }
         return sprites;
    }
}
在 Project 视图里,选中这个文本文档,右键选择功能 ShoeBox→Process to Sprites,即可自动完成导入成 Unity 的 Sprites 格式,如下图所示:

Unity 的 Sprite Editor 也自带切割图片的功能,但是当遇到比较复杂的图集时,切割的比较混乱,用 ShoeBox 正确率比较大一点。

ShoeBox 地址:  http://renderhjs.net/shoebox/
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值