实现Unity对Dictionary的序列化

unity doc: http://docs.unity3d.com/ScriptReference/ISerializationCallbackReceiver.OnBeforeSerialize.html

 1 using UnityEngine;
 2 using System.Collections.Generic;
 3
 4 /// Usage:
 5 ///
 6 /// [System.Serializable]
 7 /// class MyDictionary : SerializableDictionary<int, GameObject> {}
 8 /// public MyDictionary dic;
 9 ///
10 [System.Serializable]
11 public class SerializableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, ISerializationCallbackReceiver
12 {
13     // We save the keys and values in two lists because Unity does understand those.
14     [SerializeField]
15     private List<TKey> _keys;
16     [SerializeField]
17     private List<TValue> _values;
18
19     // Before the serialization we fill these lists
20     public void OnBeforeSerialize()
21     {
22         _keys = new List<TKey>(this.Count);
23         _values = new List<TValue>(this.Count);
24         foreach (var kvp in this)
25         {
26             _keys.Add(kvp.Key);
27             _values.Add(kvp.Value);
28         }
29     }
30
31     // After the serialization we create the dictionary from the two lists
32     public void OnAfterDeserialize()
33     {
34         this.Clear();
35         int count = Mathf.Min(_keys.Count, _values.Count);
36         for (int i = 0; i < count; ++i)
37         {
38             this.Add(_keys[i], _values[i]);
39         }
40     }
41 }
时间: 2024-10-10 01:09:49

实现Unity对Dictionary的序列化的相关文章

Unity中使用json序列化失败

问题 //为什么用json序列化这样没得问题 Dictionary<string, int> dic = new Dictionary<string, int>(); dic.Add("1", 1); string strJson = LitJson.JsonMapper.ToJson(dic); //这样有问题 Dictionary<int, int> dic2 = new Dictionary<int, int>(); dic2.Ad

使用ISerializationCallbackReceiver解决HashSet/Dictionary无法序列化的问题

自定义数据类被标记为[Serializable]后, 像 HashSet<T> / Dictionary<T> 类型的数据依然无法被Unity自动序列化.一种办法是内部再存一个数据列表(一般是List<T>类型),序列化之前先把数据倒腾到List<T>中, 在运行时加载后再执行自己写的 "Init()" 之类的函数将数据从List<T>中倒腾到 HashSet<T>中.实际上,对于这种情况,Unity已经提供了一个

[Unity编辑器]编辑器与序列化

1. using UnityEngine; using System.Collections; using UnityEditor; /// <summary> /// EditorPrefs可以序列化的数据有:bool/float/int/string /// </summary> public class TestEditor : EditorWindow { string s; [MenuItem("Window/TestEditor")] static

Unity 序列化 总结

查找了 Script Serialization http://docs.unity3d.com/Manual/script-Serialization.html 自定义序列化及例子: http://docs.unity3d.com/ScriptReference/ISerializationCallbackReceiver.OnBeforeSerialize.html 和Unity 圣典 在这博友 的基础上 再总结下Unity 的序列化 序列化的作用是: 可以显示变量(类,结构等)在inspe

ScriptableObject本地序列化后重启Unity后报The associated script can not be loaded.Please fix any compile errors and assign a valid script的坑

踩坑 做编辑器一些设置序列化存在本地的时候,继承自ScriptableObject的类通过 创建的asset文件. 在重启Unity后查看这个asset发现上面的所有序列化属性丢失,报的错就是 在不存在的网站找了一番之后,找到答案 需要本地序列化的ScriptableObject必须拥有自己的同名实体脚本文件. 也就是在上图Scipt选项中能找到的类名.cs文件 Unity貌似会根据序列化的类名去找到这个脚本文件,重新检查脚本的可序列化项,最后才将能序列化的选项重新反序列化出来. 那问题知道了,

unity序列化

什么是序列化 unity的序列化在unity的开发中起着举重足轻的地位,许多核心的功能都是基于序列化和反序列化来实现的.序列化简单来讲就是就是将我们所要保存的数据进行二进制存储,然后当我们需要的时候,在读取二进制文件,反序列化回来.下面是一些常用的序列化的例子: 存储脚本化的数据.在我们的c#代码中,可以将我们所要存储的数据进行序列化,进行存储 prefab与初始化.在unity开发过程中我们会制作很多的预制体(prefab),这些prefab都是序列化,以二进制的形式保存的.当你要对预制体进行

Unity -JsonUtility的使用

今天,为大家分享一下unity上的Json序列化,应该一说到这个词语,我们肯定会觉得,这应该是很常用的一个功能点:诚然,我们保存数据的时候,也许会用到json序列化,所以,我们有必要快速了解一下它的简单用法.[小白篇]       官方文档:https://docs.unity3d.com/Manual/JSONSerialization.html 1.首先,我们直接新建unity项目,然后新建一个JsonUtilityBehaviour.cs 组件测试类:                  J

Unity自定义mesh以及编译器

Star 自定义编辑器简易教程 an introduction to custom editors 原文地址 http://catlikecoding.com/unity/tutorials/star/ http://blog.csdn.net/lilanfei/article/details/7680802 简介 Introduction 这个教程将让你学会如何创建一个星型控件以及如何制作这个控件的自定义编辑器.你将学会: 动态的建立Mesh. 使用一个嵌套类. 建立一个自定义编辑器. 使用S

Unity的Attribute(特性)还算多吧

转载请注明出处:http://blog.csdn.net/u010019717 更全的内容请看我的游戏蛮牛地址:http://www.unitymanual.com/space-uid-18602.html ?? 属性 (Attribute) 使用 Unity 的C#语言 ,利用属性(Attribute)来类定义和变量定义或区分其他的变量,您可以设置一种特殊行为.* 1 例如,您添加[SerializeField]属性变量,私有变量标识序列化. [SerializeField] int  计数;