Unity Sprite转Prefab
2015-12-06 17:36
357 查看
新项目使用Unity5.X,遇到了一些问题,其中就有Sprite的管理更新问题,查了一些资料,Mono推荐的是转为Prefab处理。
看了一些国外同行的处理方法,分析了一个编辑器插件脚本。学到了一些技巧,使用的话依然放在Editor目录下。总结在这里吧:
使用方法如下:
![](http://images2015.cnblogs.com/blog/571545/201512/571545-20151206173330800-1173458867.png)
关于subString函数:https://msdn.microsoft.com/zh-tw/library/aka44szs
看了一些国外同行的处理方法,分析了一个编辑器插件脚本。学到了一些技巧,使用的话依然放在Editor目录下。总结在这里吧:
using UnityEngine; using UnityEditor; using System.Collections; using System.Linq; public class SpriteToPrefab { /// <summary> /// Creates Sprites To Prefab /// </summary> [MenuItem("Assets/Create/Sprite转Prefab", false, 11)] public static void SelectObjectToPrefabs() { //是否允许独立文件夹; bool isSoloFolder = EditorUtility.DisplayDialog("创建选择?", "是否单个Sprite创建独立文件夹?", "独立", "共享"); 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(); 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); } //创建对象; GameObject gameObject = new GameObject(); //添加SpriteRenderer组件; SpriteRenderer spriteRenderer = gameObject.AddComponent<SpriteRenderer>(); for (int j = 0; j < sprites.Length; j++) { //进度条; string pgTitle = (i + 1).ToString() + "/" + Selection.objects.Length + " 开始创建Prefab"; string info = "Prefab: " + j + "->" + sprites[j].name; float nowProgress = (float) j/(float) sprites.Length; EditorUtility.DisplayProgressBar(pgTitle,info ,nowProgress ); //对象名称; gameObject.name = sprites[j].name; //绑定具体Sprite; spriteRenderer.sprite = sprites[j]; //判断保存路径; string savePath = isSoloFolder ? fullFolderPath + "/" + sprites[j].name + "/" + sprites[j].name + ".prefab" : fullFolderPath + "/" + sprites[j].name + ".prefab"; if (isSoloFolder) { //创建单个Sprite独立的文件夹; if (!AssetDatabase.IsValidFolder(fullFolderPath + "/" + sprites[j].name)) { AssetDatabase.CreateFolder(fullFolderPath, sprites[j].name); } } //生成预制体; PrefabUtility.CreatePrefab(savePath, gameObject); } GameObject.DestroyImmediate(gameObject); } //释放进度条; EditorUtility.ClearProgressBar(); } /// <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); } }
使用方法如下:
![](http://images2015.cnblogs.com/blog/571545/201512/571545-20151206173330800-1173458867.png)
关于subString函数:https://msdn.microsoft.com/zh-tw/library/aka44szs
相关文章推荐
- Unity 使用 Application.LoadLevelAsync() 方法切换场景后场景变黑问题解决方法
- unity3d添加子弹爆炸预制体动画
- unity3d添加武器功能
- Unity3D与MySQL
- UNITY贝塞尔曲线Bezier的一个细节
- 【转】unity跨平台文件操作详解
- unity--ugui中文教程翻译1
- 构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(51)-系统升级
- iGraph库中Community Detection方法比较
- 使用Unity制作简单时钟动画
- 【Unity】改变向量的方向而不改变其大小
- Unity给力插件之ShaderForge(二)
- Unity客户端框架笔记二(组件实体开发模式的思考)转
- Unity客户端框架笔记(状态模式和策略模式在游戏中的应用)转
- unity3d 面试题
- Unity3D_NGUI_安卓APK安装包瘦身实践(二)
- Unity3D_NGUI_安卓APK安装包瘦身实践
- Unity3D研究院之Android全自动打包生成apk(六十九)
- Unity+Android交互教程——让手机"动"起来
- 【unity编辑器拓展】使用脚本添加Prefab到场景中