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模块很简单)。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL10keOdXSU90MNpHW3BjMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLyYTMwMTMzEjM3ITMxAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
默认配置辅助器是解析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。