新项目使用Unity5.X,遇到了一些问题,其中就有Sprite的管理更新问题,查了一些资料,Mono推荐的是转为Prefab处理。

看了一些国外同行的处理方法,分析了一个编辑器插件脚本。学到了一些技巧,使用的话依然放在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, )]
public static void SelectObjectToPrefabs()
{
//是否允许独立文件夹;
bool isSoloFolder = EditorUtility.DisplayDialog("创建选择?", "是否单个Sprite创建独立文件夹?", "独立", "共享");
for (int i = ; 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, , splitSpritePath[splitSpritePath.Length - ].Length + ) + "/" + Selection.objects[i].name;
//同名文件夹;
string folderName = Selection.objects[i].name;
string adjFolderPath = InsetFromEnd(fullFolderPath, Selection.objects[i].name.Length + );
//验证路径;
if (!AssetDatabase.IsValidFolder(fullFolderPath))
{
AssetDatabase.CreateFolder(adjFolderPath, folderName);
} //创建对象;
GameObject gameObject = new GameObject();
//添加SpriteRenderer组件;
SpriteRenderer spriteRenderer = gameObject.AddComponent<SpriteRenderer>();
for (int j = ; j < sprites.Length; j++)
{ //进度条;
string pgTitle = (i + ).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(, path.Length - inset);
} }

使用方法如下:

关于subString函数:https://msdn.microsoft.com/zh-tw/library/aka44szs

Unity Sprite转Prefab的更多相关文章

  1. Unity Sprite切割导出

    这次需要将美术提供的Sprite图集切割导出,整体思路依然和上次的Sprite转prefab一致,只是在转prefab的逻辑修改为了创建Texture的逻辑. 过程很简单,直接看最终代码结果: usi ...

  2. unity sprite怎么获取切割后的图

    学习了一段时间的unity,对里面的组件有一个大致的了解,但是具体操作来说还不是很熟悉,今天看了一片关于unity sprite怎么获取切割后的图的文章,感觉还不错. 假设有一张png/tga图集,导 ...

  3. unity, sprite atlas

    一, Sprite Packer 可以直接在unity里放碎图,只要将Texture Type选为Sprite(2D and UI),Sprite Mode选为Single,再把想打在一张大图里的碎图 ...

  4. Unity Sprite Packer 问题集合

    介绍 今天突发奇想用了下sprite packer 这个功能,基本用法网上教程一堆一堆的,这里就不赘述了. 在使用sprite packer过程中遇到一些问题,然后各种百度不到答案,最后和谐上网找到了 ...

  5. [Unity工具]嵌套Prefab

    在父Prefab中嵌套子Prefab,那么如果对这个嵌套Prefab进行修改,改变将不会应用到子Prefab中:同理,对子Prefab的修改,也不会应用到这个嵌套Prefab中.因此,就会出现一些问题 ...

  6. Unity批量生成Prefab

    在项目中有时会遇到批量生成Prefab的需求.于是写了一个编辑器,用来实现此功能. 在Hierarchy面板中选中多个GameObject,点击生成Prefab即可. 如果所选物体中包含自定义Mesh ...

  7. Unity Sprite Atlas Compression

    http://forum.unity3d.com/threads/2d-sprite-packer-and-pvrtc.218633/ http://docs.unity3d.com/Manual/S ...

  8. unity技巧

    在之前的程序编写过程中,虽然对相关的方法进行了实例化,但是在运行的时候总是会出现“未将对象引用设置到对象的实例”,出现该种问题的原因是由于在实例化后,没有对实例化进行引用赋值,所以导致相关变量无法在其 ...

  9. [Unity] unity5.3 assetbundle打包及加载

    Unity5.3更新了assetbundle的打包和加载api,下面简单介绍使用方法及示例代码. 在Unity中选中一个prefab查看Inspector窗口,有两个位置可以进行assetbundle ...

随机推荐

  1. selenium杀掉浏览器进程方法

    * 杀掉浏览器进程      */     public static void operateWindowsProcess(){         WindowsUtils.tryToKillByNa ...

  2. 【Python】我的Python学习笔记【1】【using Python 2】

    1.模块格式 #!/usr/bin/env python # -*- coding: utf-8 -*- ... ...def main(): ...... ... if __name__=='__m ...

  3. VS2012解决方案的设置

    用VS开发项目时,一个解决方案可以包含多个项目,在此我记录一下: 1.首先我新建一个Win32Demo的解决方案: 2.勾选"空项目": 3.新建完之后,会默认生成一个Win32D ...

  4. kvm -- Kernel-based Virtual Machine

    1.虚拟机类型: 类型1 硬件上直接安装hp  类型2 硬件上安装HOST 上面跑VMM 2.kvm概要 kvm 不算类型1也不算类型二.两种特性都有,他是linux的一个内核模块,内核中本身没有hv ...

  5. D3.js 力导向图

    花了大半天看了一个八十几行的代码..心累 力导向图是之前就有画过很多次的东西,但是这次的代码看上去很陌生,然后发现是D3更新了4.0.... 先贴代码 var svg = d3.select(&quo ...

  6. 关于js touch事件 的引用设置

    一开始做前端页面的时候,接触的也是js,但是随后便被简单高效的jquery吸引过去,并一直使用至今. 而js,则被我主观的认为底层技术而抛弃. 直到这几天工作需要,研究移动端页面的触屏滑动事件,搜索j ...

  7. Linux下文件重命名、创建、删除、修改及保存文件

    一.重命名(更名) linux 给文件改名的命令是mv命令 mv命令来为文件或目录改名或将文件由一个目录移入另一个目录中.该命令等同于DOS系统下的ren和move命令的组合.它的使用权限是所有用户. ...

  8. 机器学习职位 & 面经

    http://www.cnblogs.com/peileyuan/p/4775453.html <浅谈机器学习的职业发展方向> http://blog.sina.com.cn/s/blog ...

  9. STL中的查找算法

    STL中有很多算法,这些算法可以用到一个或多个STL容器(因为STL的一个设计思想是将算法和容器进行分离),也可以用到非容器序列比如数组中.众多算法中,查找算法是应用最为普遍的一类. 单个元素查找 1 ...

  10. 防止SVN冲突,Elipse资源同步介绍

    灰色向右箭头: 本地修改了 灰色向右箭头且中间有白色减号: 本地删除了,服务器未删除 灰色向右且中间有个加号的箭头:本地比SVN上多出的文件 蓝色向左箭头:svn上修改过 蓝色向左且中间有个加号的箭头 ...