天天看点

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。