将一个个小图打包成图集,以减小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菜单,将文件夹拖到其中,选择需要动态加载的图片,点击创建按钮即可。
需要动态加载的图片
创建为精灵对象的效果: