Unity序列化
来源:互联网 发布:安卓软件开发编程论坛 编辑:程序博客网 时间:2024/05/29 04:54
ScriptableObject
参考网址
* ScriptableObject类型经常用于存储一些unity3d本身不可以打包的一些object,比如字符串,一些类对象等。*
[System.Serializable]public class SkillItem{ public int skillid; public string skillname;}[System.Serializable]public class GameDataScriptable :ScriptableObject{ public List<SkillItem> skillItemList = new List<SkillItem>();}
打包ScriptObject,ScriptObject 可以存储任何数据类型
//通过ScriptableObject创建一个对象的实例 GameDataScriptable gs = ScriptableObject.CreateInstance<GameDataScriptable>(); //对对象的属性进行赋值 for(int i=1;i<3;i++){ SkillItem item = new SkillItem(); item.SkillId = i; item.SkillName = "技能" + i; gs.SkillDictionary.Add(item); } //创建资源文件(可以在编辑器下直接编辑数据) AssetDatabase.CreateAsset(gs, "Assets/GameDataConfig.asset"); //将资源反序列化为一个对象 Object o = AssetDatabase.LoadAssetAtPath("Assets/GameDataConfig.asset", typeof(GameDataScriptable)); //assetbundle文件只能在运行时加载,并且只能通过WWW加载 BuildPipeline.BuildAssetBundle(o, null, "Assets/GameData.assetbundle"); //删除临时的资源文件 AssetDatabase.DeleteAsset("Assets/GameDataConfig.asset");
运行时加载这个数据资源
public class LoadFile:MonoBehaviour { IEnumerator Start () { WWW www = new WWW("file://" + Application.dataPath + "/../GameDataConfig.assetbundle"); yield return www; //转换资源为Test,这个test对象将拥有原来在编辑器中设置的数据。 GameDataScriptable test = www.assetBundle.mainAsset as GameDataScriptable; } }
提示:这其实就是把对象的实例打包,如果ScriptObject 属性中包括其他类的实例,则这些类需要加上[Serializable]序列化。通过这种方法,可以将系统需要的数据打包,
加载后直接转换为预定义的类型,可大大加快数据加载读取的速度,具有更高的效率。
SerializeField
强制Unity序列化私有变量
当Unity序列化脚本时,只会序列化公有成员,如果你也想序列化私有成员,可以添加上[SerializeField]属性
以下可被序列化:
- 不是静态的公有成员
- 不是静态,不是公有,被标记为[SerializeField]属性
- 不能序列化 static 成员
- 不能序列化 属性(properties)
Serializable
序列化类型:
- 所有继承自UnityEngine.Object 的类,例如:GamObject,Component,MonoBehaviour,Texture2D,AnimationClip
- 所有基础类型,例如 int,string,float,bool
- 一些内置的类型,例如 Vactor2,Vector3,Vector4,Quaternion,Matrix4x4,Color,Rect,LayerMask
- 可序列化类型的数组
- 可序列化类型的List
- Enums
- Structs
注意:
1、不要将一个成员添加到数组或者list两次,当数组或者list被序列化的时候,你将得到这个成员两次,而在新的list或者数组再拷贝一份
2、Unity不会序列化字典,但是你可以将key,和value分别存储在list中
[System.Serializable] public class SerializableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, ISerializationCallbackReceiver { [SerializeField] private List<TKey> _keys = new List<TKey>(); [SerializeField] private List<TValue> _values = new List<TValue>(); public void OnBeforeSerialize() { _keys.Clear(); _values.Clear(); _keys.Capacity = this.Count; _values.Capacity = this.Count; foreach (var kvp in this) { _keys.Add(kvp.Key); _values.Add(kvp.Value); } } public void OnAfterDeserialize() { this.Clear(); int count = Mathf.Min(_keys.Count, _values.Count); for (int i = 0; i < count; ++i) { this.Add(_keys[i], _values[i]); } } } //usage://[System.Serializable] //public class MyDictionary:SerializableDictionary<int,GameObject>{};//public MyDictionary dic;
ISerializationCallbackReceiver是Unity提供的,可以在序列化/反序列化过程中监听回调的一个接口,需要实现OnBeforeSerialize和OnAfterDeserialize两个方法
阅读全文
0 0
- Unity中的序列化
- Unity JSON 序列化
- unity [serializefiled]序列化
- Unity序列化
- Unity中数据序列化
- unity 类的序列化
- Unity.JsonUtility序列化指南
- Unity中的序列化Scriptable
- unity序列化系统小结-来自unity手册(Script Serialization)
- Unity序列化和持久化
- Unity使用JsonFX插件进行序列化
- Unity - 序列化 ScriptableObject、SerializedProperty 编辑器运用
- Unity C# 序列化 保存物体信息
- [Unity编辑器]编辑器与序列化
- 关于Unity游戏的序列化
- Unity资源,对象和序列化
- Unity中的序列化数据丢失
- Unity中的序列化数据丢失
- LC射频滤波器调试经验
- mvninstall项目报 编码GBK的不可映射字符
- nginx upload模块+python 后端处理模仿fastdfs实现文件存取
- htk 工具使用介绍
- thrift服务化改造原理分析
- Unity序列化
- 解决pcb搭线问题的过程
- 迭代对象、迭代器、生成器浅析
- Ubuntu下安装Eclipse开发环境(Eclipse IDE for C/C++ Developers)
- eclipse开发go语言入门案例
- mongodb笔记05(MongoDB 复制(副本集))
- Ubuntu 14下apache2开启对.htaccess支持
- 第十三周项目3
- Day013