Unity編輯器中Dictionary的序列化

編輯器Dictionary序列化

開發過程中,經常需要在Unity的Inspector面板中對場景進行一些數據配置。Unity也爲我們提供了許多序列化數據的方式,不過沒有提供Dictionary數據的可視化序列化;今天在AssetStrore中找到一款免費的SerializableDictionary插件,非常輕巧,可是很方便,你可以根據自己的需求自定義你需要序列化的Dictionary類型,且不需要寫任何寫編輯器代碼。當你的鍵值無效或者重複時,會觸發警告。

AssetStore: SerializableDictionary


1

作者爲我們提供了一些默認的字典類型,但是我們可以根據自己的需求,自定義一些可在Inspector面板中進行可視化操作的字典類型。

例子一

定義一個支持可視化操作的Dictionary<string,string>


在這裏插入圖片描述

遊戲Unity中是不支持泛型數據的序列化的,所以我們序列化對象時需要制定要被序列化的對象的具體類型。

  1. 首先在UserSerializableDictionaries.cs文件中聲明我們要序列化的字典類型。
[Serializable]
public class StringStringDictionary : SerializableDictionary<string, string> { }
  1. UserSerializableDictionaryPropertyDrawers.cs中定義需要可視化的字典。
[CustomPropertyDrawer(typeof(StringStringDictionary))]
public class AnySerializableDictionaryPropertyDrawer : SerializableDictionaryPropertyDrawer {}

例子二

定義一個支持可視化操作的 ***Dictionary<string,List< GameObject> >***


在這裏插入圖片描述

由於Unity中不支持序列化嵌套集合和嵌套數組,如果我們使用SerializableDictionary<TKey,TValue[]> 或者SerializableDictionary<TKey,List> 的方式來進行字典的可視化操作,這是不可行的,它不會在 Inspector 面板中顯示且值也不會被保存。

  1. 所以,我們必須創建一箇中間類,在UserSerializableDictionaries.cs文件中聲明我們要存儲的數據類型,將 List 或者 Array 包裹在其中,如下:
[Serializable]
public class ListGameObjectStorage : SerializableDictionary.Storage<List<GameObject>> { }
  1. 聲明需要定義的字典類型(注意這裏定義了第三個參數,用來指定存儲的數據類型):
[Serializable]
public class StringListObjectsDictionary : SerializableDictionary<string, List<GameObject>,ListGameObjectStorage> { }
  1. UserSerializableDictionaryPropertyDrawers.cs中定義需要可視化的字典。
[CustomPropertyDrawer(typeof(ListGameObjectStorage))]
public class AnySerializableDictionaryStoragePropertyDrawer: SerializableDictionaryStoragePropertyDrawer {}
[CustomPropertyDrawer(typeof(StringListObjectsDictionary))]
public class AnySerializableDictionaryPropertyDrawer : SerializableDictionaryPropertyDrawer {}

例子三

在字典中可視化操作自定義的數據類型。

Dictionary<string,List< SkyBoxLightingPair > >


在這裏插入圖片描述

假如,我有一個如下的數據類型,需要使用字符串作爲鍵值的形式將其保存在字典中,且要支持 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);
    }
}
  1. UserSerializableDictionaries.cs中爲自定義的數據類型定義中間類
[Serializable]
public class ListSkyBoxLightingPairStroge:SerializableDictionary.Storage<List<SkyBoxLightingPair>>{}

聲明需要在字典中序列化的數據類型

[Serializable]
public class StringSkyBoxConfigPairDictonary:SerializableDictionary<string,List<SkyBoxLightingPair>,ListSkyBoxLightingPairStroge>{}
  1. 爲上述定義的數據類型添加屬性在 Inspector 面板中繪製的聲明:
[CustomPropertyDrawer(typeof(ListSkyBoxLightingPairStroge))]
public class AnySerializableDictionaryStoragePropertyDrawer: SerializableDictionaryStoragePropertyDrawer {}
[CustomPropertyDrawer(typeof(StringSkyBoxConfigPairDictonary))]
public class AnySerializableDictionaryPropertyDrawer : SerializableDictionaryPropertyDrawer {}

以上就是在 Inspector 面板中可視化操作 Dictionary 的內容。

更多內容,歡迎訪問:


在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章