赞
踩
将一个个小图打包成图集,以减小Drawcall(类似coco2d-x一样,打包成图集一次性加载以内存换取图片读取效率),但是这样打包成图集后,动态使用就比较麻烦。
下面这种方法可以将需要动态使用的小图批量创建为精灵对象,从而方便动态加载使用。
我们直接看动态加载使用:
- private Image image;
-
- void Start () {
- image = GetComponent<Image>();
- //image.sprite = AssetDatabase.LoadAssetAtPath<SpriteScriptObject>("Assets/Resources/liaoji1_01.asset").sprite;// .asset后缀的加载方式
- image.sprite = Resources.Load<SpriteScriptObject>("liaoji1_01").sprite; // .prefab后缀的加载方式
- }
精灵对象类:
- // 精灵对象类,继承自ScriptableObject
- public class SpriteScriptObject : ScriptableObject
- {
- [SerializeField]
- public Sprite sprite;
- //public int Level;
- }
创建精灵对象的编辑器,允许批量创建:
- using UnityEngine;
- using UnityEditor;
-
- // 创建精灵对象的编辑器,允许批量创建
- public class CreateSpriteEditor : EditorWindow
- {
- public static CreateSpriteEditor createSprite;
-
- public UnityEngine.Object Folder = null; // 用于获取文件夹路径
- public string FolderPath = string.Empty; // 保存路径
-
- [MenuItem("Tools/CreateSpriteAsset")]
- public static void ShowCreateWindow() // 打开窗口
- {
- Debug.Log("ShowCreateWindow");
-
- createSprite = EditorWindow.GetWindowWithRect<CreateSpriteEditor>(new Rect(0, 0, 500, 300));
- createSprite.Show();
-
- // 直接创建一个精灵对象
- //AssetDatabase.CreateAsset(new SpriteScriptObject(), "Assets/Resources/liaoji1_01.prefab");
- //AssetDatabase.SaveAssets();
- //AssetDatabase.Refresh();
- }
-
- // 绘制窗口
- void OnGUI()
- {
- // 设置保存的文件夹路径 将文件夹拖拽到框内即可
- Folder = EditorGUILayout.ObjectField("Save Folder:", Folder, typeof(UnityEngine.Object), false); // 物体字段(字段前面的可选标签,字段显示的物体,物体的类型,允许指定场景物体)
- EditorGUILayout.Space();
- if (null != Folder)
- {
- FolderPath = AssetDatabase.GetAssetPath(Folder);
- }
-
- // 显示保存路径
- EditorGUILayout.Space();
- GUILayout.BeginHorizontal();
- GUILayout.Label("Save Path:");
- GUILayout.TextField(FolderPath);
- GUILayout.EndHorizontal();
-
-
- if (GUILayout.Button("Create Select"))
- {
- CreateSpriteScriptObject();
- }
- }
-
- // 创建精灵对象
- private void CreateSpriteScriptObject()
- {
- // 获取选择的图片对象
- UnityEngine.Object[] selectObjs = Selection.GetFiltered(typeof(Object), SelectionMode.Assets); //返回通过类型和选择模式过滤的当前选择的物体(类型,选择模式)
-
- // 根据选择的图片对象来创建精灵对象
- for (int i = 0; i < selectObjs.Length; ++i)
- {
- Object obj = selectObjs[i] as Object;
- if (null != obj)
- {
- string filePath = AssetDatabase.GetAssetPath(obj);
- Sprite s = AssetDatabase.LoadAssetAtPath<Sprite>(filePath);
- if (null != s)
- {
- SpriteScriptObject spriteSO = ScriptableObject.CreateInstance<SpriteScriptObject>();
- if (null != spriteSO)
- {
- spriteSO.sprite = s;
- }
-
- AssetDatabase.CreateAsset(spriteSO, FolderPath + "/" + s.name + ".prefab"); // .asset后缀也是可以的,不过加载方式不同
- EditorUtility.SetDirty(spriteSO);
- //AssetDatabase.SaveAssets();
- //AssetDatabase.Refresh();
- }
-
- }
- }
- }
- }
操作步骤:在菜单栏打开Tools/CreateSpriteAsset菜单,将文件夹拖到其中,选择需要动态加载的图片,点击创建按钮即可。
需要动态加载的图片
创建为精灵对象的效果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。