• Unity Sprite切割导出


    这次需要将美术提供的Sprite图集切割导出,整体思路依然和上次的Sprite转prefab一致,只是在转prefab的逻辑修改为了创建Texture的逻辑。

    过程很简单,直接看最终代码结果:

    using System.IO;
    using UnityEngine;
    using UnityEditor;
    using System.Linq;
    
    public class SpriteToSplit  {
    
        /// <summary>
        /// 切割Sprite导出单个对象
        /// </summary>
        [MenuItem("Assets/Create/SpriteSplit2Export", false, 12)]
        public static void SpriteChildToExport()
        {
            for (int i = 0; i < Selection.objects.Length; i++)
            {
                //获得选择对象路径;
                string spritePath = AssetDatabase.GetAssetPath(Selection.objects[i]);
                //所有子Sprite对象;
                Sprite[] sprites = AssetDatabase.LoadAllAssetsAtPath(spritePath).OfType<Sprite>().ToArray();
                if (sprites.Length < 1)
                {
                    EditorUtility.DisplayDialog("错误", "当前选择文件不是Sprite!", "确认");
                    Debug.LogError("Sorry,There is not find sprite!");
                    return;
                }
                string[] splitSpritePath = spritePath.Split(new char[] { '/' });
                //文件夹路径 通过完整路径再去掉文件名称即可;
                string fullFolderPath = Inset(spritePath, 0, splitSpritePath[splitSpritePath.Length - 1].Length + 1) + "/" + Selection.objects[i].name;
                //同名文件夹;
                string folderName = Selection.objects[i].name;
                string adjFolderPath = InsetFromEnd(fullFolderPath, Selection.objects[i].name.Length + 1);
                //验证路径;
                if (!AssetDatabase.IsValidFolder(fullFolderPath))
                {
                    AssetDatabase.CreateFolder(adjFolderPath, folderName);
                }
    
                for (int j = 0; j < sprites.Length; j++)
                {   //进度条;
                    string pgTitle = (i + 1).ToString() + "/" + Selection.objects.Length + " 开始导出Sprite";
                    string info = "当前Srpte: " + j + "->" + sprites[j].name;
                    float nowProgress = (float)j / (float)sprites.Length;
                    EditorUtility.DisplayProgressBar(pgTitle, info, nowProgress);
                    //创建Texture;
                    Sprite sprite = sprites[j];
                    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();
                    //判断保存路径;
                    string savePath = fullFolderPath + "/" + sprites[j].name + ".png";
                    //生成png;
                    File.WriteAllBytes(savePath,tex.EncodeToPNG());
                }
                //释放进度条;
                EditorUtility.ClearProgressBar();
                //刷新资源,不然导出后你以为没导出,还要手动刷新才能看到;
                AssetDatabase.Refresh();
            }
    
        }
    
        /// <summary>
        /// 截取路径
        /// </summary>
        /// <param name="path"></param>
        /// <param name="leftIn">左起点</param>
        /// <param name="rightIn">右起点</param>
        /// <returns></returns>
        public static string Inset(string path, int leftIn, int rightIn)
        {
            return path.Substring(leftIn, path.Length - rightIn - leftIn);
        }
    
        /// <summary>
        /// 截取路径
        /// </summary>
        /// <param name="path"></param>
        /// <param name="inset"></param>
        /// <returns></returns>
        public static string InsetFromEnd(string path, int inset)
        {
            return path.Substring(0, path.Length - inset);
        }
    }

    使用方法如下图:

  • 相关阅读:
    java多线程(八)-死锁问题和java多线程总结
    java多线程(七)-线程之间的 协作
    java多线程(六)-线程的状态和常用的方法
    在SOUI中使用网格布局
    SOUI视频教程
    在SOUI中使用动态多语言切换
    在SOUI中使用窗口自適應大小
    在SOUI中使用线性布局
    搜索引擎广告过滤Chrome插件
    第三十四篇:在SOUI中使用异步通知
  • 原文地址:https://www.cnblogs.com/2Yous/p/5047707.html
Copyright © 2020-2023  润新知