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);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本