ScriptableObject类型经常用于存储一些unity3d本身不可以打包的一些object,比如字符串,一些类对象等。用这个类型的子类型,则可以用BuildPipeline打包成assetbundle包供后续使用,非常方便。这样除了playerpref和c#文件读取外,另外的一种存取一些数据对象的方法
- using UnityEngine;
- public class XMLContains : ScriptableObject
- {
- public string theXML;
- }
By making your class enherit from ScriptableObject, it becomes an "Asset Type" to unity, in the sense that you can store them on disk, and use the Unity IDE interface to drag it from the assetsfolder to a behaviour or whatever. It also automatically plays nice with Unity's dependency tracking system that decides what does and what does not go into a webplayer. Going a bit further with this example, you could have let's say a TieFighter class, actually get some of its information (max health, max speed, acceleration), from your xml file, by making the TieFighter class look like this:
- using UnityEngine;
- public class TieFighter : MonoBehaviour
- {
- public XMLContainer myXMLSettings;
- void Awake()
- {
- //parse myXMLSettings.theXML into reasonable data
- }
- void Update()
- {
- //use the reasonable data
- }
- }
You could then attach the TieFighter script to a gameobject, and then drag your xml-asset from your assetsfolder onto the myXMLSettings public field.Please note that this example is much better at showing how you could use a ScriptableObject than how to properly implement a TieFighter, as I would never really have that parse an actual xml file on runtime. Tiefighters are too cool for xml anyway.
以上是不做成bundle包的形式,下面提供了一种打包成bundle资源,通过www来进行载入的方案:
通常,可以用BuildPipeline.BuildAssetBundle打包资源,这些资源包括模型、纹理、贴图等。其实也可以打包ScriptableObject,而ScriptableObject中可以存储任何数据类型。
以下为一个完整示例。
1、先创建一个类:
- using UnityEngine;
- using System.Collections.Generic;
- public class SysData : ScriptableObject
- {
- public List<Vector3> content;
- }
该类只有一个属性content。当然也可以声明更多属性、事件和方法。
在后面,这个类的实例将作为资源被打包。
2、创建一个编辑器脚本:
该脚本用于实例化SysData,设置一些数据,然后打包。
- using UnityEngine;
- using UnityEditor;
- using System.Collections.Generic;
- public class Export
- {
- [MenuItem("Assets/Export")]
- public static void Execute()
- {
- //实例化SysData
- SysData sd = ScriptableObject.CreateInstance<SysData>();
- //随便设置一些数据给content
- sd.content = new List<Vector3>();
- sd.content.Add(new Vector3(1,2,3));
- sd.content.Add(new Vector3(4,5,6));
- // SysData将创建为一个对象,这时在project面板上会看到这个对象。
- string p = "Assets/SysData.asset";
- AssetDatabase.CreateAsset(sd, p);
- Object o = AssetDatabase.LoadAssetAtPath(p, typeof(SysData));
- //打包为SysData.assetbundle文件。
- BuildPipeline.BuildAssetBundle(o, null, "SysData.assetbundle");
- //删除面板上的那个临时对象
- AssetDatabase.DeleteAsset(p);
- }
- }
3、运行时加载这个数据资源。
- IEnumerator Start ()
- {
- WWW www = new WWW("file://" + Application.dataPath + "/../SysData.assetbundle");
- yield return www;
- //转换资源为SysData,这个sd对象将拥有原来在编辑器中设置的数据。
- SysData sd = www.assetBundle.mainAsset as SysData;
- //如打印sd.content[0],将得到Vector3(1,2,3);
- print(sd.content[0]);
- }
4、这其实是把整个对象实例打包,如果ScriptableObject属性中包括其他的类实例,则这些类需加上[Serializable]序列化。通过这种方法,可以将系统需要的数据(如角色分类、matrix4x4数据等等)打包,加载后直接转换为预定的类型,具有更高的效率。
相关推荐
Unity ScriptableObject序列化对象的简单用法,包含了怎么定义、创建、加载一个序列化对象
用于在自定义ScriptableObject和MonoBehaviour类中添加有序词典的库,只要键和值类型是可序列化的,就可以由Unity进行序列化。 $ yarn add rotorz/unity3d-ordered-dictionary 该软件包与工具兼容。 有关将程序...
Excel数据解析,自动创建对应C#类,自动创建ScriptableObject生成类,自动序列化Asset文件 功能介绍链接 https://z-c-s.blog.csdn.net/article/details/125608062
Unity 中使用Protobuf进行序列化和反序列化的Demo
第5 章 在Unity 3D 中使用泛型121 第6 章 在Unity 3D 中使用委托149 第7 章 Unity 3D 中的定制特性 202 第8 章 Unity 3D 协程背后的迭代器 228 第9 章 在Unity 3D 中使用可空型 260 第10 章 从序列化和反序列化看...
可序列化字典 Unity的可序列化字典类。 Unity无法序列化标准字典。 这意味着它们将不会在检查器中显示或编辑,... 可以在检查器中对其进行编辑,而无需实现自定义编辑器或属性抽屉。 检查器将处理无效的字典键,例
Unity最快的序列化/反序列化工具
在Cocos2dx中,对大图的处理已经封装好了一套自己的API,但是在Unity3D中貌似没有类似的API,或者说我没找到。不过这也在情理之中,毕竟Unity3D是做3D的,要切割图片的地方还是很少的。 因为我用Unity3D主要是用于...
Unity3D之简单的帧动画 代码 博文地址:http://blog.csdn.net/midashao/article/details/8139109
unity2018的 Json 文件的序列化反序列化读写工程,主要是支持反序列化读取Json文件,序列化写入Json文件的unity2018的Demo。里面自带了Newtonsoft.Json的Newtonsoft.Json.dll。
该代码为Unity Editor 使用序列化保存数据,将数据显示在Inspector 面板上的操作
在unity用于json的序列化和反序列化插件(适用语言c#) 配合教程参见我的“unity/c#解析json”
在Unity5中Protobuf的序列化和反序列化,解决了因Android和IOS平台的不同而不能解析的问题。
什么叫序列化? 我们都知道对象是暂时保存在内存中的,不...在进行这些操作的时候都需要这个可以被序列化,要能被序列化,就得给类头加[Serializable]特性。 通常网络程序为了传输安全才这么做。不知道回答清晰满意否?
kryo中间件实例,内容:使用kryo使java对象object序列化成字符串,并使之反序列化为对象。 一个完整的工程,可使用eclipse导入,可运行DemoMain查看结果,有注释 资源包括依赖的kryo-2.24.0.jar、minlog-1.2.jar、...
简单快捷的序列化存储。
Protobuf unity3d,利用socket进行进程通信 ,利用protobuf进行序列化 与反序列化
unity序列化工作原理和实例.docx unity序列化工作原理和实例.docx unity序列化工作原理和实例.docx unity序列化工作原理和实例.docx unity序列化工作原理和实例.docx
unity字典序列化工具SerializableDictionary 仅供学习,请勿商用。
ProtoBuf的介绍以及在Java中使用protobuf将对象进行序列化与反序列化示例代码.rar