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子產品很簡單)。
預設配置輔助器是解析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函數。
重新實作那個格式的配置輔助器比較好點呢。首先預設輔助器的txt先淘汰掉,讓策劃用記事本儲存txt格式進行配表,你配起來開心不開心我不知道,但是我知道大部分策劃會把你按在桌子上捅死,檔案格式選擇其實主要考慮三點:性能、資料可觀性、易增删改查。具體什麼意思呢?
1、xlsx格式可通過Excel軟體打開,這個辦公軟體使用普遍,但此格式檔案會比較大、性能也不好。
2、csv格式也可以通過Excel打開,性能和檔案大小表現良好,個人比較推薦。
3、json格式通過其他軟體打開,性能和檔案大小表現良好,個人不推薦,因為其他軟體沒有良好的資料可觀性、易增删改查。
具體如何實作csv配置輔助器呢?具體可以查閱C#讀取CSV。