Unity Sprite转Prefab

新项目使用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, 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);
    }

}

使用方法如下:

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

时间: 2024-08-05 01:59:27

Unity Sprite转Prefab的相关文章

从gif到unity sprite——批量转换gif、批量导入texture packer图集为sprite、批量生成sprite预制体

背景是我有几百个角色gif资源,每个都有:站立.攻击.技能攻击的gif,我想用此资源作2d unity游戏,因此第一关就是如何把gif转成unity动画 GIF 转 PNG -- http://blog.csdn.net/leinchu/article/details/24806433 ,不再赘述了. 之后是批量gif用tp打包,我用php写了一个脚本遍历目录,下的gif把他们重命名并每个角色建立一个文件夹,把它的所有动作的png序列移动到他自己的目录去,再用tp打包: 上php代码,因为我是分

Unity加载prefab时调用脚本函数顺序

加载prefab时使用两个接口: GameObject objPrefab = Resources.Load(pathName) as GameObject; GameObject frame = NGUITools.AddChild(parent, objPrefab); //parent为对象需要挂载到的父节点对象 对象在被挂载到父节点上时,会调用脚本,分为两种情况: 1.prefab初始保存为Active状态 立刻按顺序触发 Awake, OnEnable 函数, 下一帧触发Start函数

[Unity工具]嵌套Prefab

在父Prefab中嵌套子Prefab,那么如果对这个嵌套Prefab进行修改,改变将不会应用到子Prefab中:同理,对子Prefab的修改,也不会应用到这个嵌套Prefab中.因此,就会出现一些问题,例如子Prefab已经是最新的了,但是嵌套Prefab却是旧的.在unity2018.3中,已经有新功能来处理嵌套Prefab的问题了,但是之前的版本还是得要处理这个问题. 原文地址:https://www.cnblogs.com/lyh916/p/10428609.html

Unity Sprite Atlas Compression

http://forum.unity3d.com/threads/2d-sprite-packer-and-pvrtc.218633/ http://docs.unity3d.com/Manual/SpritePacker.html http://docs.unity3d.com/Manual/class-TextureImporter.html http://docs.unity3d.com/ScriptReference/Sprites.AtlasSettings-compressionQu

使用Unity3D50个技巧-50 Tips for Working with Unity (Best Practices)

原文: 50 Tips for Working with Unity (Best Practices) About these tips These tips are not all applicable to every project. They are based on my experience with projects with small teams from 3 to 20 people. There's is a price for structure, re-usabilit

unity的一些重要技巧(转)【整理他人的东西】

刚开始学习Unity3D时间不长,在看各种资料.除了官方的手册以外,其他人的经验也是非常有益的.偶尔看到老外这篇文章,觉得还不错,于是翻译过来和大家共享.原文地址: http://devmag.org.za/2012/07/12/50-tips-for-working-with-unity-best-practices/ 关于这些技巧 这些技巧不可能适用于每个项目. 这些是基于我的一些项目经验,项目团队的规模从3人到20人不等: 框架结构的可重用性.清晰程度是有代价的--团队的规模和项目的规模决

【转载】关于对方法实例化的相关感悟以及unity的50个技巧

关于实例化问题的感悟(笔者自悟,大神勿喷) 在之前的程序编写过程中,虽然对相关的方法进行了实例化,但是在运行的时候总是会出现"未将对象引用设置到对象的实例",出现该种问题的原因是由于在实例化后,没有对实例化进行引用赋值,所以导致相关变量无法在其他方法中进行读取,以后需对此谨记. 同时之前浏览过一片大神写过的关于unity相关技巧的文章,笔者觉得受益匪浅,现将链接与原文转载于下,希望可以帮助大家. 使用Unity3D的50个技巧:Unity3D最佳实践 作者:房燕良 关于这些技巧 这些技

unity--------prefab嵌套prefab

最近造了个轮子可以批量替换prefab里的prefab,欢迎大家测试-  https://bitbucket.org/xuanyusong/prefab-replace 最近在做UI部分中遇到了这样的问题,就是Prefab里面预制了Prefab.可是在Unity里面一旦Prefab预制了Prefab那么内部的Prefab就失去关联.导致与如果要改内部的Prefab需要把所有引用的地方全部改一遍.今天在逛国外网站看到了一个老外的思路,原文在这里 http://framebunker.com/blo

Unity常见面试题大全

1.       [C#语言基础]请简述拆箱和装箱. 答: 装箱操作: 值类型隐式转换为object类型或由此值类型实现的任何接口类型的过程. 1.在堆中开辟内存空间. 2.将值类型的数据复制到堆中. 3.返回堆中新分配对象的地址. 拆箱操作: object类型显示转换为值类型或从接口类型到实现该接口值类型的过程. 1.判断给定类型是否是装箱时的类型. 2.返回已装箱实例中属于原值类型字段的地址. 2.        [.NET(C#)] attribute,property,markup,ta