OOIII/

NGUI使用texturepacker的资源批量生成图集

最近做的一个项目中需要用到图集,做了个实验,一张1024的png,NGUI生成的图集要比texturepacker大出100kb来,所以决定用texturepacker制作图集再给NGUI用,但是有个问题,在使用texturepacker制作的图集时需要替换相应的大图和配置文件,只有一个图集还好办,但是我要使用100个图集,如果每个都手动拖拽,还不得累死我啊,so想用代码一键生成,NGUI没有这样的功能,只能自己写插件了,过程还算顺利,只是有一个地方,导入tp配置文件时愣是没找到这个方法或者属性,头都大了,后来,我随便拖一个文件到tp import项中,有个警告,顺着这个警告我就找到了那个方法,看来报错也是一件好事啊!

代码奉上,注意,继承Eidtor时才可以使用解析字符串的方法,所以脚本要放在Editor文件夹中,在使用前确保tp的图集和配置文件已按照一定的命名规则放在Resources文件夹或者子文件夹中。

using UnityEngine;
using System.Collections;
using UnityEditor;
using System.Collections.Generic;
public class Prefab__ : Editor
{
    [MenuItem("OOIII/prefab_1")]
    static void Prefab_()
    {
        GameObject tempObj = new GameObject();
        tempObj.AddComponent<UIAtlas>();

        for (int i = -10; i < 11; i++)
        {
            for (int j = 0; j < 5; j++)
            {
                string fileName = "LP_HG020_" + i.ToString() + "_" + j.ToString();
                //创建材质球
                Material emptyMat = new Material(Shader.Find("Unlit/Transparent Colored"));
                AssetDatabase.CreateAsset(emptyMat, "Assets/Resources/Prefabs/" + fileName + ".mat");
                emptyMat = Resources.Load("Prefabs/" + fileName, typeof(Material)) as Material;
                Texture t2d = Resources.Load("Prefabs/" + fileName, typeof(Texture)) as Texture;
                emptyMat.mainTexture = t2d;
                //给临时go赋材质
                tempObj.GetComponent<UIAtlas>().spriteMaterial = emptyMat;
                //导入配置文件
                TextAsset txt = Resources.Load("Prefabs/" + fileName, typeof(TextAsset)) as TextAsset;
                NGUIJson.LoadSpriteData(tempObj.GetComponent<UIAtlas>(), txt);
                //创建预设体		
                string fileLocation = "Assets/Resources/Prefabs/" + fileName + ".prefab";
                Object emptyObj = PrefabUtility.CreateEmptyPrefab(fileLocation);
                PrefabUtility.ReplacePrefab(tempObj, emptyObj, ReplacePrefabOptions.ConnectToPrefab);
            }
        }
        Editor.DestroyImmediate(tempObj);
        AssetDatabase.Refresh();
    }
}