参考链接:
http://www.xuanyusong.com/archives/3304
http://www.xuanyusong.com/archives/3315
Sprite Packer的使用:
http://liweizhaolili.blog.163.com/blog/static/1623074420131151303310/
关键点:
1.在unity5中,Statistics面板中的Batches即为drawcall。并且,新建一个空场景,drawcall的初始值为2,所以一般drawcall的计算要从2开始
2.在导入图片时,最好就是一个图集对应一个文件夹,文件夹的名字即为图集的名字
using UnityEngine; using UnityEditor; using System.IO; public class AutoSetPackingTag : AssetPostprocessor { void OnPostprocessTexture(Texture2D texture) { string atlasName = new DirectoryInfo(Path.GetDirectoryName(assetPath)).Name; TextureImporter textureImporter = assetImporter as TextureImporter; textureImporter.textureType = TextureImporterType.Sprite; textureImporter.spritePackingTag = atlasName; textureImporter.mipmapEnabled = false; } }
3.需要打包成图集的图片不能放在Resources文件夹内,也就是说,我们无法通过Resources.Load的方式加载图片。对此,有两种解决方法:
a.将图片保存到prefab中,prefab放到Resources文件夹内。不过当需要加载的图片比较多时,这种方法就比较麻烦。可以使用ScriptableObject把图片序列化保存,这样会比较方便一些
using UnityEngine; using System.Collections.Generic; using System.IO; using UnityEditor; public class SpriteScriptableObject : ScriptableObject { public List<Sprite> list = new List<Sprite>(); //字典无法被序列化 public Dictionary<string, Sprite> nameSpriteDir = new Dictionary<string, Sprite>(); public void ReadData(string dataDir) { list = new List<Sprite>(); string[] filePaths = Directory.GetFiles(dataDir); foreach(string s in filePaths) { if (!s.EndsWith(".meta")) { Sprite sprite = AssetDatabase.LoadAssetAtPath<Sprite>(s); list.Add(sprite); Debug.Log(sprite.name); } } } public void Init() { for (int i = 0; i < list.Count; i++) { nameSpriteDir.Add(list[i].name, list[i]); } } }
using UnityEngine; using System.Collections; using UnityEditor; using System.IO; using System.Reflection; using System; public enum ScriptableObjectType { SpriteScriptableObject, } public class CreateScriptableObject : EditorWindow { static string dataDir; static string outputDir = "Assets/"; static string name; static ScriptableObjectType scriptableObjectType; [MenuItem("Window/CreateScriptableObject")] static void Init() { EditorWindow.GetWindow(typeof(CreateScriptableObject)); } void OnGUI() { EditorGUILayout.BeginHorizontal(); dataDir = EditorGUILayout.TextField("数据目录", dataDir); if (GUILayout.Button("拾取路径")) dataDir = AssetDatabase.GetAssetPath(Selection.objects[0]); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); outputDir = EditorGUILayout.TextField("输出目录", outputDir); if (GUILayout.Button("拾取路径")) outputDir = AssetDatabase.GetAssetPath(Selection.objects[0]); EditorGUILayout.EndHorizontal(); name = EditorGUILayout.TextField("名字", name); scriptableObjectType = (ScriptableObjectType)EditorGUILayout.EnumPopup("类型", scriptableObjectType); if (GUILayout.Button("输出")) { //Type.GetType对于继承UnityEngine.Object的类会返回空 //string className = scriptableObjectType.ToString(); //Debug.Log(className); //Type t = Type.GetType(className); //if (t == null) Debug.Log("null"); switch (scriptableObjectType) { case ScriptableObjectType.SpriteScriptableObject : SpriteScriptableObject so = ScriptableObject.CreateInstance<SpriteScriptableObject>(); so.ReadData(dataDir); AssetDatabase.CreateAsset(so, outputDir + name + ".asset"); break; default: break; } AssetDatabase.Refresh(); } } }
using UnityEngine; using System.Collections; using System.Collections.Generic; using UnityEngine.UI; public class NewBehaviourScript1 : MonoBehaviour { public Image[] images; // Use this for initialization void Start () { SpriteScriptableObject sso = Resources.Load<SpriteScriptableObject>("2"); sso.Init(); Debug.Log(sso.list.Count); Debug.Log(sso.nameSpriteDir.Count); images[0].sprite = sso.nameSpriteDir["a"]; images[1].sprite = sso.nameSpriteDir["b"]; images[2].sprite = sso.nameSpriteDir["c"]; } }
b.使用AB包的形式。将同一个图集的小图的AB包名字设置为相同的,即可将这些小图打包到同一个AB包中
using UnityEngine; using System.Collections; using UnityEngine.UI; public class NewBehaviourScript : MonoBehaviour { public Image[] images; // Use this for initialization void Start () { AssetbBundleManager.Instance.Load(@"file:///" + Application.dataPath + "/AB/", "2.unity3d", (ab, name) => { Sprite a = AssetbBundleManager.Instance.GetAsset<Sprite>(ab, "a"); images[0].sprite = a; Sprite b = AssetbBundleManager.Instance.GetAsset<Sprite>(ab, "b"); images[1].sprite = b; Sprite c = AssetbBundleManager.Instance.GetAsset<Sprite>(ab, "c"); images[2].sprite = c; }); } }
5.如果把带透明通道和不带透明通道的小图打包到同一图集,unity会把它分成两组