编辑器之批量创建精灵对象ScriptObject用于动态加载

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

需要动态加载的图片

创建为精灵对象的效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值