关于ScriptableObject的使用

前言:
这两天在看Attribute章节时,看到了CreateAssetMenuAttribute,通过Asset/Create的子弹菜单,来快捷的创建ScriptableObject
派生类的实例,并以.aaset资源文件的形式,保存在项目中。

这是个蛮不错的设计,官方文档解释称,如果你想要创建一些对象,而这些对象并不依赖GameObject,不使用GetComponent
之类的方法,你可以从ScriptableObject类派生,该类继承自Object.源码如下:

using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using UnityEngine.Scripting;

namespace UnityEngine
{
    [RequiredByNativeCode]
    [StructLayout (LayoutKind.Sequential)]
    public class ScriptableObject : Object
    {
        //
        // Constructors
        //
        public ScriptableObject ();

        //
        // Static Methods
        //
        [GeneratedByOldBindingsGenerator]
        [MethodImpl (MethodImplOptions.InternalCall)]
        public static extern ScriptableObject CreateInstance (string className);

        public static ScriptableObject CreateInstance (Type type);

        public static T CreateInstance<T> () where T : ScriptableObject;

        [GeneratedByOldBindingsGenerator]
        [MethodImpl (MethodImplOptions.InternalCall)]
        private static extern ScriptableObject CreateInstanceFromType (Type type);

        [GeneratedByOldBindingsGenerator]
        [MethodImpl (MethodImplOptions.InternalCall)]
        private static extern void INTERNAL_CALL_SetDirty (ScriptableObject self);

        [GeneratedByOldBindingsGenerator, ThreadAndSerializationSafe]
        [MethodImpl (MethodImplOptions.InternalCall)]
        private static extern void Internal_CreateScriptableObject ([Writable] ScriptableObject self);

        //
        // Methods
        //
        [Obsolete ("Use EditorUtility.SetDirty instead")]
        public void SetDirty ();
    }
}

派生自ScriptableObject的类:

public class testEdit : ScriptableObject {
    public int a = 10;
    public int b = 11;
    public int c = 12;
    [Multiline][ContextMenuItem("Reset", "ResetString")]
    public string abc;

}

创建实例有两种形式:

1.通过代码来创建实例,并完成初始化,最后存储到本地,后缀为".asset"。

testEdit test = testEdit.CreateInstance<testEdit> ();
        test.name = "testEdit";
        test.a = 5;
        test.b = 6;
        test.c = 7;
        test.abc =""+test.a + test.b + test.c;
        UnityEditor.AssetDatabase.CreateAsset (test, "Assets/"+test.name+".asset");

2.通过添加CreateAssetMenuAttribute,在Assets/Create上进行快捷创建。

[CreateAssetMenu(fileName = "xxxx",menuName = "xxx/xxx")]
public class testEdit : ScriptableObject {
    public int a = 10;
    public int b = 11;
    public int c = 12;
    [Multiline][ContextMenuItem("Reset", "ResetString")]
    public string abc;

}

说明:
fileName:生成asset文件的文件名。
menuName:在Assets/Create上子菜单的名字。

image.png

创建后的资源文件可以直接图形化的设计对象参数的值。并保存。通过成后的testEdit.asset,可以设置assetbudleName来
成assetBundle。

查看生成后的testEdit.asset文件:

%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
  m_ObjectHideFlags: 0
  m_PrefabParentObject: {fileID: 0}
  m_PrefabInternal: {fileID: 0}
  m_GameObject: {fileID: 0}
  m_Enabled: 1
  m_EditorHideFlags: 0
  m_Script: {fileID: 11500000, guid: 49f3c284ec29c234a86002519acaf09e, type: 3}
  m_Name: testEdit
  m_EditorClassIdentifier: 
  a: 5
  b: 6
  c: 7
  abc: 567

使用的YAML非标记语言将类的信息存储起来,并不是我们序列化生成的字节流。

读取testEdit.asset,如果你设置成了AssetBundle,直接使用AssetBundle的方式加载即可,否则就放在Resources文件夹下,如下:

testEdit t = (testEdit)Resources.Load ("testEdit");
        if (t != null) {
            Debug.Log (t.a + "," + t.b + "," + t.c + "," + t.abc);
        }

最后,ScriptableObject派生的类可以方便的存储成外部文件,并且以图形化的操作修改对象的属性数值。
比如一些静态的数据,如常量,关卡,任务,成就等等配置表,与将类序列化成字节流文件并运行时反序列化转换成对象的使用流程是一样的。
但如果说是用来做静态数据表,显然这是没有EXCEL里操作更为方便,非技术人员通常都喜欢用EXCEL来操作配置表,更灵活,功能更强大,自由度更高,且更方便使用,技术只要提供导出工具,不论是导出外部的数据文件,xml,json,pb,自定义等等,还是在导出的过程中,直接序列化成文件都可以,而且这些通常都有了比较成熟的解决方案,在unity引擎之前很多都是这么过来的。

我目前在项目中还没有使用过ScriptableObject的地方,有些功能确实是可以使用他来实现,但是已经有其它的解决办法了,本质上并没有什么区别。

更新(2018.7.25):听腾讯一位前端大拿说,不太推荐使用ScriptableObject,因为他的解析效率比较低,不及pb以及Json,但在开发编辑器时,可以把编辑器所需要的一些数据存下来,使用这种形式还是可以的。


到此为止,如果大家发现有什么不对的地方,欢迎指正,共同提高,感谢您的阅读!

编辑于2018.7.19

时间过得好快,世界杯已经过去4天了,中超也随之开始,保利尼奥刚踢完世界杯就回到了中超,真是明智之举,他很难再进入下一次世界杯大名单,巴萨在下赛季也不一定有他的位置,他在巴萨这一年的表现还是很惊艳的,又拿到了联赛冠军和国王杯,非常的让人羡慕,但那毕竟是巴萨,竟争力太强,自己也快到了足球生涯的末期,恒大能给出一笔非常有诚意的合同,
这是一定要仔细考虑的,我相信他的选择是无比正确的,他在恒大踢出了成绩,去了巴萨,实现了自己的梦想,现在回到恒大
继续效力直至职业生涯终老,没有什么比这更好的结局了。祝福保利尼奥,希望拿下恒大八连冠!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,825评论 4 377
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,887评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,425评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,801评论 0 224
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,252评论 3 299
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,089评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,216评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 31,005评论 0 215
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,747评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,883评论 2 255
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,354评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,694评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,406评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,222评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,242评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,017评论 2 281

推荐阅读更多精彩内容

  • 首先附上原文链接:https://unity3d.com/cn/learn/tutorials/topics/be...
    Bonging阅读 733评论 0 0
  • 首先附上原文链接:https://unity3d.com/learn/tutorials/topics/best-...
    Bonging阅读 1,134评论 0 0
  • 翻译:莫铭原文地址:AssetBundle usage patterns 本系列中的上一篇文章覆盖了AssetBu...
    莫铭阅读 5,133评论 1 12
  • 1、什么是AssetBundle AssetBundle 是Unity pro提供的一种用来存储资源的文件格式,它...
    好怕怕阅读 7,410评论 1 8
  • 没有谁一直在 靠得住的只有自己 所有前行的路 有人走了 有人来了 但是 无论是天晴黑夜 总有一段路要自己走
    一排森阅读 107评论 0 2