ScriptableObject

 场景视图和游戏视图等编辑器窗口是从 ScriptableObject 的派生类生成的,用于在 Inspector 中显示 GUI 的Editor 对象也是从 ScriptableObject 的派生类生成的。可以毫不夸张地说,Unity编辑器是使用 ScriptableObject 创建的。

创建 ScriptableObject

要创建 ScriptableObject,首先需要创建一个继承自 ScriptableObject 类的类。此
时,类名和资产名必须相同。与 MonoBehaviour 相同的限制。

using UnityEngine;
public class ExampleAsset : ScriptableObject
{
}

实例化

与 MonoBehaviour 相同,因为您需要通过 Unity 的序列化机制创建对象

using UnityEngine;
using UnityEditor;
public class ExampleAsset : ScriptableObject
{
   [MenuItem ("Example/Create ExampleAsset Instance")]
   static void CreateExampleAssetInstance ()
   {
      var exampleAsset = CreateInstance<ExampleAsset> ();
   }
}

保存

[MenuItem ("Example/Create ExampleAsset")]
static void CreateExampleAsset ()
{
   var exampleAsset = CreateInstance<ExampleAsset> ();
   AssetDatabase.CreateAsset (exampleAsset, "Assets/Editor/ExampleAsset.asset");
   AssetDatabase.Refresh ();
}

此外,**CreateAssetMenu **您可以轻松地创建一个资产使用属性。

// 在 Assets 下添加菜单
// fileName 生成名为 Bullet的脚本
// menuName 菜单按钮名New Bullet
// order    按钮显示顺序
[CreateAssetMenu(fileName="ExampleAsset",menuName = "Example/CreateExampleAsset")]
public class ExampleAsset : ScriptableObject
{
}

从脚本加载资产的 ScriptableObject

[MenuItem ("Example/Load ExampleAsset")]
static void LoadExampleAsset ()
{
   var exampleAsset =AssetDatabase.LoadAssetAtPath<ExampleAsset>
   ("Assets/Editor/ExampleAsset.asset");
}
using UnityEngine;
using UnityEditor;
public class ExampleAsset : ScriptableObject
{
   [SerializeField]
   string str;
   [SerializeField, Range (0, 10)]
   int number;
   [MenuItem ("Example/Create ExampleAsset Instance")]
   static void CreateExampleAssetInstance ()
   {
       var exampleAsset = CreateInstance<ExampleAsset> ();
       AssetDatabase.CreateAsset (exampleAsset, "Assets/Editor/ExampleAsset.asset");
       AssetDatabase.Refresh ();
   }
}

ScriptableObject 的父子关系

public class ParentScriptableObject : ScriptableObject
{
   [SerializeField]
   ChildScriptableObject child;
}
public class ChildScriptableObject : ScriptableObject
{
   [SerializeField]
   string str;
   public ChildScriptableObject ()
   {
      name = "New ChildScriptableObject";
   }
}
using UnityEngine;
using UnityEditor;
public class ParentScriptableObject : ScriptableObject
{
    const string PATH = "Assets/Editor/New ParentScriptableObject.asset";
    [SerializeField]
    ChildScriptableObject child;
    [MenuItem ("Assets/Create ScriptableObject")]
    static void CreateScriptableObject ()
    {
        var parent = ScriptableObject.CreateInstance<ParentScriptableObject> ();
        parent.child = ScriptableObject.CreateInstance<ChildScriptableObject> ();
        AssetDatabase.CreateAsset (parent, PATH);
       AssetDatabase.ImportAsset (PATH);
    }
}
posted @   LuLuEarl  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示