开发过程中,经常需要在Unity的Inspector面板中对场景进行一些数据配置。Unity也为我们提供了许多序列化数据的方式,不过没有提供Dictionary数据的可视化序列化;今天在AssetStrore中找到一款免费的SerializableDictionary插件,非常轻巧,可是很方便,你可以根据自己的需求自定义你需要序列化的Dictionary类型,且不需要写任何写编辑器代码。当你的键值无效或者重复时,会触发警告。
AssetStore: SerializableDictionary
作者为我们提供了一些默认的字典类型,但是我们可以根据自己的需求,自定义一些可在Inspector面板中进行可视化操作的字典类型。
定义一个支持可视化操作的Dictionary
游戏Unity中是不支持泛型数据的序列化的,所以我们序列化对象时需要制定要被序列化的对象的具体类型。
[Serializable]
public class StringStringDictionary : SerializableDictionary<string, string> { }
[CustomPropertyDrawer(typeof(StringStringDictionary))]
public class AnySerializableDictionaryPropertyDrawer : SerializableDictionaryPropertyDrawer {}
定义一个支持可视化操作的 ***Dictionary
由于Unity中不支持序列化嵌套集合和嵌套数组,如果我们使用SerializableDictionary
[Serializable]
public class ListGameObjectStorage : SerializableDictionary.Storage<List<GameObject>> { }
[Serializable]
public class StringListObjectsDictionary : SerializableDictionary<string, List<GameObject>,ListGameObjectStorage> { }
[CustomPropertyDrawer(typeof(ListGameObjectStorage))]
public class AnySerializableDictionaryStoragePropertyDrawer: SerializableDictionaryStoragePropertyDrawer {}
[CustomPropertyDrawer(typeof(StringListObjectsDictionary))]
public class AnySerializableDictionaryPropertyDrawer : SerializableDictionaryPropertyDrawer {}
在字典中可视化操作自定义的数据类型。
Dictionary
假如,我有一个如下的数据类型,需要使用字符串作为键值的形式将其保存在字典中,且要支持 Inspector 面板中的可视化操作。自定义数据类型如下:
[Serializable]
public class SkyBoxLightingPair
{
public Material skyBoxmaterial;
public string name;
public List<string> answerList;
public Vector3 sunEulerAngles;
public Dictionary<string,List<GameObject>> mydict=new Dictionary<string, List<GameObject>>();
public void Show()
{
Debug.Log(name);
Debug.Log(answerList.Count);
Debug.Log(sunEulerAngles);
}
}
[Serializable]
public class ListSkyBoxLightingPairStroge:SerializableDictionary.Storage<List<SkyBoxLightingPair>>{}
声明需要在字典中序列化的数据类型
[Serializable]
public class StringSkyBoxConfigPairDictonary:SerializableDictionary<string,List<SkyBoxLightingPair>,ListSkyBoxLightingPairStroge>{}
[CustomPropertyDrawer(typeof(ListSkyBoxLightingPairStroge))]
public class AnySerializableDictionaryStoragePropertyDrawer: SerializableDictionaryStoragePropertyDrawer {}
[CustomPropertyDrawer(typeof(StringSkyBoxConfigPairDictonary))]
public class AnySerializableDictionaryPropertyDrawer : SerializableDictionaryPropertyDrawer {}
以上就是在 Inspector 面板中可视化操作 Dictionary 的内容。
更多内容,欢迎访问: