新项目使用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. [书]WALL·E、龙与地下铁、中国美丽的故事、故事新编、四十自述、书虫、人工智能、大话数据结构

    下午有时间,逛了逛了书城,看到了一些书.在这里总结一些自己的感受.   一.<龙与地下铁>     这本书是我首先看到的,就在靠前的新书区.是小说,我没看里面的内容,但是被书封皮的宣传文案 ...

  2. LabVIEW有限状态机

    顺序模式是我们最先接触,也是最基本的一种编程模式, 程序按照固定的顺序依次执行,结束(如图1) 但在很多情况下,静态的顺序模式并不能满足我们编程的要求,我们需要更有效地动态结构来实时改变程序的执行顺序 ...

  3. Python 基础练习

    今天接触了python,了解了一下 python 的基础语法,于是想着手训练一下,在本习题集中,参考代码为提供的参考答案,前面的代码为自己思考的代码,最后每道题给出练习的时间. Python 基础练习 ...

  4. mysql 登录及常用命令

    一.mysql服务的启动和停止 mysql> net stop mysql mysql> net start mysql 二.登陆mysql mysql> 语法如下: mysql - ...

  5. Spring事务管理只对出现运行期异常进行回滚

    原文:http://blog.csdn.net/abc19900828/article/details/39497631 使用spring难免要用到spring的事务管理,要用事务管理又会很自然的选择 ...

  6. ionic cordova

    ionic cordova 打包 文章 http://blog.csdn.net/i348018533/article/details/47258449 http://www.cnblogs.com/ ...

  7. iframe 根据加载内容调整高度

    iframe标签代码 <iframe id="checkListFrame" name="checkListFrame"    src="Ind ...

  8. javascript new

    1. 仅function可以使用new 2. function使用new时,会拷贝function中this的内容给新对象,并将function的prototype指向新对象(如果该function没 ...

  9. google应用商店的解决

    { "enabled_plugins": [ "SimpleReloadPlugin", "SimpleRefresh" ] } git c ...

  10. PHP中多态,抽象类,接口,

    小例子: 需求:公司定义一个接口让我们开发功能 usb.interface.php: <?php interface USB{ public function run(); } store.cl ...