天天看點

Gameframework(Config進階篇)

1.Config常用接口

優秀的遊戲都必須支援高度化的可配性,Gameframework架構的Config子產品是遊戲開發時的必須子產品,接下來會給出Conifg子產品的常用接口表格。

ReadData 加載配置檔案資源到配置字典中。
ParseData 解析配置内容到配置檔案中。
HasConfig 是否存在配置項。
GetBool 通過指定配置項讀取布爾值。
GetInt 通過指定配置項讀取整數值。
GetFloat 通過指定配置項讀取浮點數。
GetString 通過指定配置項讀取字元串值。

Config子產品使用步驟,先調用ReadData接口将指定配置檔案加載、解析或使用ParseData接口解析配置内容儲存到字典中,解析出來的k-v都儲存在唯一字典中的,并不是每個配置檔案對應儲存到不同字典中,是以注意配置檔案内容的Key確定唯一性,如下方式去命名會比較好(比如地圖的配置檔案,加上map_字首)。

map_bosshp 100000
map_bossmp 1000
           

2.架構實作了什麼?

Config子產品将配置檔案進行加載、解析、儲存這些步驟,這些函數實作都是在上層實作的(Unity的DefaultConfigHelper中),首先給出配置子產品依賴圖(Config子產品很簡單)。

Gameframework(Config進階篇)

預設配置輔助器是解析txt格式,一般都解析xlsx、csv、json檔案的,其實配置輔助器是被配置管理器中的DataProvider<IConfigManager>持有的,調用ReadData使用資料總管加載配置檔案然後再調用m_DataProviderHelper.ReadData,具體的函數實作如下圖所示:

public void ReadData(string dataAssetName, int priority, object userData)
        {
            if (m_ResourceManager == null)
            {
                throw new GameFrameworkException("You must set resource manager first.");
            }

            if (m_DataProviderHelper == null)
            {
                throw new GameFrameworkException("You must set data provider helper first.");
            }

            HasAssetResult result = m_ResourceManager.HasAsset(dataAssetName);
            switch (result)
            {
                case HasAssetResult.AssetOnDisk:
                case HasAssetResult.AssetOnFileSystem:
                    m_ResourceManager.LoadAsset(dataAssetName, priority, m_LoadAssetCallbacks, userData);
                    break;

                case HasAssetResult.BinaryOnDisk:
                    m_ResourceManager.LoadBinary(dataAssetName, m_LoadBinaryCallbacks, userData);
                    break;

                case HasAssetResult.BinaryOnFileSystem:
                    int dataLength = m_ResourceManager.GetBinaryLength(dataAssetName);
                    EnsureCachedBytesSize(dataLength);
                    if (dataLength != m_ResourceManager.LoadBinaryFromFileSystem(dataAssetName, s_CachedBytes))
                    {
                        throw new GameFrameworkException(Utility.Text.Format("Load binary '{0}' from file system with internal error.", dataAssetName));
                    }

                    try
                    {
                        if (!m_DataProviderHelper.ReadData(m_Owner, dataAssetName, s_CachedBytes, 0, dataLength, userData))
                        {
                            throw new GameFrameworkException(Utility.Text.Format("Load data failure in data provider helper, data asset name '{0}'.", dataAssetName));
                        }

                        if (m_ReadDataSuccessEventHandler != null)
                        {
                            ReadDataSuccessEventArgs loadDataSuccessEventArgs = ReadDataSuccessEventArgs.Create(dataAssetName, 0f, userData);
                            m_ReadDataSuccessEventHandler(this, loadDataSuccessEventArgs);
                            ReferencePool.Release(loadDataSuccessEventArgs);
                        }
                    }
                    catch (Exception exception)
                    {
                        if (m_ReadDataFailureEventHandler != null)
                        {
                            ReadDataFailureEventArgs loadDataFailureEventArgs = ReadDataFailureEventArgs.Create(dataAssetName, exception.ToString(), userData);
                            m_ReadDataFailureEventHandler(this, loadDataFailureEventArgs);
                            ReferencePool.Release(loadDataFailureEventArgs);
                            return;
                        }

                        throw;
                    }

                    break;

                default:
                    throw new GameFrameworkException(Utility.Text.Format("Data asset '{0}' is '{1}'.", dataAssetName, result.ToString()));
            }
        }
           

3.擴充分析

IConfigHelper接口在目前的配置子產品是毫無意義的,在解決方案中可以删掉這個接口。在Unity中不必去實作和調用SetConfigHelper函數。

Gameframework(Config進階篇)

重新實作那個格式的配置輔助器比較好點呢。首先預設輔助器的txt先淘汰掉,讓策劃用記事本儲存txt格式進行配表,你配起來開心不開心我不知道,但是我知道大部分策劃會把你按在桌子上捅死,檔案格式選擇其實主要考慮三點:性能、資料可觀性、易增删改查。具體什麼意思呢?

1、xlsx格式可通過Excel軟體打開,這個辦公軟體使用普遍,但此格式檔案會比較大、性能也不好。

2、csv格式也可以通過Excel打開,性能和檔案大小表現良好,個人比較推薦。

3、json格式通過其他軟體打開,性能和檔案大小表現良好,個人不推薦,因為其他軟體沒有良好的資料可觀性、易增删改查。

具體如何實作csv配置輔助器呢?具體可以查閱C#讀取CSV。