Unity编辑器扩展 Chapter7--使用ScriptableObject持久化存储数据

摘要:
使用UnityEngine;使用系统;namespaceMyScirptableObject{[Serializable]publicclassLevelSettings:ScriptableObject{publicfloatgravity=-30;publicAudioClipbgm;publicSpritebackground;}}要创建包含此数据类的资产资源,可以通过多种方式创建此资源,主要使用CreateInstance的ScriptableObject方法1:使用工具菜单创建。注意:添加以下方法publicstaticTCreateAsset<T>,其中T:ScriptableObject{TdataClass=ScriptableObject.CreateInstance<T>();AssetDatabase.CreateAsset;AssetDatabase.Refresh();AssetDatabase.SaveAssets();returndataClass;}[MenuItem]privatestaticvoidNewLevelSettings(){stringpath=EditorUtility.SaveFilePanelInProject;if(path!=“”){EditorUtils.CreateAsset;}}效果:菜单模式2:右键单击“项目”面板,然后使用“创建”菜单创建usingUnityEngine;使用UnityEngine。事件;[CreateAssetMenu]publicclassMyScriptableScript:ScriptableObject{publicstringName;publicintLevel;publicGameObjectPreamb;publicUnityEventEvent;publicvoidInstance(){GameObjectgo=GameObject.Instalite;go.name=name;Event.AddListener(()=˃{Debug.Log((“callevent!”));foreach{render.material.color=color.red;}});事件Invoke();}}效果:创建创建后,我们可以在Inspector面板中向资源添加数据。资产使用ScirptableObject存储的数据可以直接在used类中声明为所需的ScriptableObject类型。
Unity编辑器扩展 Chapter7--使用ScriptableObject持久化存储数据
unity unity Editor ScirptableObject 
Unity编辑器扩展 Chapter7--使用ScriptableObject持久化存储数据

OverView

API
ScriptableObject是unity中的一种特别的类型,它不需要挂在场景中的对象上。它可以视作asset资源一样,存储在项目文件中。在一些特殊的情况下要比JSON,XML及TXT方式来存储持久化数据要受益得多。因为unity可以自主序列化和解析该类型,而不需要像其他方式一样需要第三方工具或自己编写解析工具。

注意:它仍然有Awake,OnEnable,OnDestory等方法可以供你使用,详见上方API

创建一个ScriptableObject

需要创建一个ScriptableObject只需要让一个类继承ScriptableObject即可。

using UnityEngine;
using System;
namespace MyScirptableObject {
[Serializable]
public class LevelSettings : ScriptableObject {
	public float gravity = -30;
	public AudioClip bgm;
	public Sprite background;
	}
}

创建一个包含该数据类的asset资源

可以通过多种方式来创建该资源,主要使用 ScriptableObject.CreateInstance 方法

方式一:使用tool菜单创建

注意:在使用Editor类中添加如下方法

public static T CreateAsset<T>(string path)
where T : ScriptableObject {
T dataClass = (T) ScriptableObject.CreateInstance<T>();
AssetDatabase.CreateAsset(dataClass, path);
AssetDatabase.Refresh();
AssetDatabase.SaveAssets();
return dataClass;
}

[MenuItem ("Tools/Level Creator/New Level Settings")]
private static void NewLevelSettings () {
string path = EditorUtility.SaveFilePanelInProject(
"New Level Settings",
"LevelSettings",
"asset",
"Define the name for the LevelSettings asset");
if(path != "") {
EditorUtils.CreateAsset<LevelSettings>(path);
}
}

效果:

Menu

Menu

方式二:右键Project面板使用Create菜单创建

using UnityEngine;
using UnityEngine.Events;

[CreateAssetMenu(menuName= "CreateMyScriptableScript",fileName= "Scripts/MyScriptableScript")]
public class MyScriptableScript : ScriptableObject
{
    public string Name;
    public int Level;
    public GameObject Prefab;
    public UnityEvent Event;

    public void Instance()
    {
        GameObject go = GameObject.Instantiate(Prefab);
        go.name = Name;
        Event.AddListener(() =>
        {
            Debug.Log(("call event!"));
            foreach (var renderer in go.transform.GetChild(0).GetComponentsInChildren<Renderer>())
            {
                renderer.material.color = Color.red;
            }
            
        });
        Event.Invoke();
    }

}

效果:

Create

Create

创建后我们就可以在Inspector面板中在为该asset添加数据

DataAsset

DataAsset

使用ScirptableObject存储的数据

直接在使用的类中声明需要的ScriptableObject类型即可。然后就可以将之前创建好的asset资源添加到上面,我们就可以使用该方式存储的数据了。

Use

Use

免责声明:文章转载自《Unity编辑器扩展 Chapter7--使用ScriptableObject持久化存储数据》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇css中的文本字间距离、行距、overflowopenstack快速修改配置下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【Unity】透明物体显示问题

总结一下Shader开启透明渲染后的一些显示问题的解决方案,考虑Zwrite,Ztest,Queue这三个属性的设置问题。 首先需要记住的是: 对于不透明物体,渲染的正确顺序是从前往后; 对于半透明物体。渲染的顺序是从后往前。 这样才能实现正确的渲染输出。 注意:Alpha Test,Alphato Coverage不在讨论之列。这里涉及到的是使用Alph...

Unity 切割导出精灵

Unity中经常使用到精灵,尤其是2D游戏中制作动画等!今天我们就学习下精灵的切割和导出吧! 废话不多说,先建议空的工程。 1,打开Unity建工程。 2 导入素材进行资源分类,工程不在于大小,这是我们对待它的态度! 3.开始分割精灵,三步走! 编辑精灵. 开始分割精灵 Apply一下,看下分割的精灵,0-9共9个。 贴精灵导出代码: using...

Unity Tiny &amp;amp; ECS 学习笔记

1.官方文档 https://docs.unity3d.com/Packages/com.unity.tiny@0.13/manual/intro-for-unity-developers.html 2.Tiny ECS 与传统 Unity 的区别 Unity一个工程一个项目,而Tiny目前是包括在Unity工程里的,一个工程里可以有多个项目,通过双击...

博客园 投放 谷歌广告(google adsense) 且不被屏蔽掉

今天测试在博客园上面投放google adsense广告,几次添加代码之后发现博客园的默认的编辑器会屏蔽掉引用的src地址   虽然好用 但是可能是安全考虑  屏蔽了引用到google的地址  当粘贴到博客园默认的TinyMce编辑器后  我的代码就变成如下了    解决方法:在博客园的后台设置中  将编辑器修改为CuteEditor  ,修改过后 成功...

VSCode编辑器使用技巧:快捷输入HTML代码(转)

原文:https://www.cnblogs.com/kharvey/p/12990787.html VSCode中有一些快捷编辑HTML的方法,能大大提高工作效率,在这记录一些。 1.输入html:5,然后按tab键或enter键,效果如下: 1 <!-- 输入html或者html:5生成页面模板 --> 2 <!DOCTYPE h...

Unity在UI界面上显示3D模型/物体,控制模型旋转

Unity3D物体在UI界面的显示 本文提供全流程,中文翻译。 Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例) Chinar —— 心分享、心创新!助力快速利用 UGUI 完成 3D 物体在 UI 界面的显示为新手节省宝贵的时间,避免采坑! Chinar 教程效果:...