当前位置:   article > 正文

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

unity 动态加载scriptobject

将一个个小图打包成图集,以减小Drawcall(类似coco2d-x一样,打包成图集一次性加载以内存换取图片读取效率),但是这样打包成图集后,动态使用就比较麻烦。

下面这种方法可以将需要动态使用的小图批量创建为精灵对象,从而方便动态加载使用。

 

我们直接看动态加载使用:

  1. private Image image;
  2. void Start () {
  3. image = GetComponent<Image>();
  4. //image.sprite = AssetDatabase.LoadAssetAtPath<SpriteScriptObject>("Assets/Resources/liaoji1_01.asset").sprite;// .asset后缀的加载方式
  5. image.sprite = Resources.Load<SpriteScriptObject>("liaoji1_01").sprite; // .prefab后缀的加载方式
  6. }

精灵对象类:

  1. // 精灵对象类,继承自ScriptableObject
  2. public class SpriteScriptObject : ScriptableObject
  3. {
  4. [SerializeField]
  5. public Sprite sprite;
  6. //public int Level;
  7. }

创建精灵对象的编辑器,允许批量创建:

  1. using UnityEngine;
  2. using UnityEditor;
  3. // 创建精灵对象的编辑器,允许批量创建
  4. public class CreateSpriteEditor : EditorWindow
  5. {
  6. public static CreateSpriteEditor createSprite;
  7. public UnityEngine.Object Folder = null; // 用于获取文件夹路径
  8. public string FolderPath = string.Empty; // 保存路径
  9. [MenuItem("Tools/CreateSpriteAsset")]
  10. public static void ShowCreateWindow() // 打开窗口
  11. {
  12. Debug.Log("ShowCreateWindow");
  13. createSprite = EditorWindow.GetWindowWithRect<CreateSpriteEditor>(new Rect(0, 0, 500, 300));
  14. createSprite.Show();
  15. // 直接创建一个精灵对象
  16. //AssetDatabase.CreateAsset(new SpriteScriptObject(), "Assets/Resources/liaoji1_01.prefab");
  17. //AssetDatabase.SaveAssets();
  18. //AssetDatabase.Refresh();
  19. }
  20. // 绘制窗口
  21. void OnGUI()
  22. {
  23. // 设置保存的文件夹路径 将文件夹拖拽到框内即可
  24. Folder = EditorGUILayout.ObjectField("Save Folder:", Folder, typeof(UnityEngine.Object), false); // 物体字段(字段前面的可选标签,字段显示的物体,物体的类型,允许指定场景物体)
  25. EditorGUILayout.Space();
  26. if (null != Folder)
  27. {
  28. FolderPath = AssetDatabase.GetAssetPath(Folder);
  29. }
  30. // 显示保存路径
  31. EditorGUILayout.Space();
  32. GUILayout.BeginHorizontal();
  33. GUILayout.Label("Save Path:");
  34. GUILayout.TextField(FolderPath);
  35. GUILayout.EndHorizontal();
  36. if (GUILayout.Button("Create Select"))
  37. {
  38. CreateSpriteScriptObject();
  39. }
  40. }
  41. // 创建精灵对象
  42. private void CreateSpriteScriptObject()
  43. {
  44. // 获取选择的图片对象
  45. UnityEngine.Object[] selectObjs = Selection.GetFiltered(typeof(Object), SelectionMode.Assets); //返回通过类型和选择模式过滤的当前选择的物体(类型,选择模式)
  46. // 根据选择的图片对象来创建精灵对象
  47. for (int i = 0; i < selectObjs.Length; ++i)
  48. {
  49. Object obj = selectObjs[i] as Object;
  50. if (null != obj)
  51. {
  52. string filePath = AssetDatabase.GetAssetPath(obj);
  53. Sprite s = AssetDatabase.LoadAssetAtPath<Sprite>(filePath);
  54. if (null != s)
  55. {
  56. SpriteScriptObject spriteSO = ScriptableObject.CreateInstance<SpriteScriptObject>();
  57. if (null != spriteSO)
  58. {
  59. spriteSO.sprite = s;
  60. }
  61. AssetDatabase.CreateAsset(spriteSO, FolderPath + "/" + s.name + ".prefab"); // .asset后缀也是可以的,不过加载方式不同
  62. EditorUtility.SetDirty(spriteSO);
  63. //AssetDatabase.SaveAssets();
  64. //AssetDatabase.Refresh();
  65. }
  66. }
  67. }
  68. }
  69. }

操作步骤:在菜单栏打开Tools/CreateSpriteAsset菜单,将文件夹拖到其中,选择需要动态加载的图片,点击创建按钮即可。

需要动态加载的图片

创建为精灵对象的效果:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/112517
推荐阅读
相关标签
  

闽ICP备14008679号