一款新的预研项目Chernobog:Rebirth的开发笔记——数据持久化。

这个新项目在我的理解看来就是类似于文明一样的那种六边形地块策略游戏。

由于策划同学在沟通的时候有讲到一种比较公式化的数值体系,比如:感染率与效率的关系,人口与效率的关系,所以打算确定一个辅助脚本来方便策划用数据表的形式对游戏进行配置。

有几种选择可以选:

  • Excel转database(例如MySQL这种数据库),然后在Unity内读取数据库
  • Excel/CSV读取,读取为一个数据类的实例,在运行时对实例进行操作
  • Excel/CSV转Json/XML,存储为一个对应格式的文本文件,在运行时对文本文件进行解析。

搜了一下,感觉Unity连接数据库的过程有些麻烦,而且也不清楚是否在目标运行的机器上也需要连接数据库,所以没有选择这种方案;其次是使用Excel的一个拓展——Epplus,这个过程宣雨松老师的那本《Unity3D开发》有写;最后决定的是使用CSV格式的文件来进行操作。

总体思路

我定义了两个类,一个是CSVObject,用来表示单行数据;一个是CSVTable,用来储存整表数据,其主要字段如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// CSVObject表示单行数据
public class CSVObject
{
// 主键
public string _ID;
// 一条数据包含的所有键名
public string[] _AllKeys;
// 除主键之外的所有键值对
private Dictionary<string,string> _attributeDic;
}

// CSVTable表示整表,用于实例化
public class CSVTable
{
// 表名
public string Name
{
get{return _name;}
}
private string _name;

// 获取表中的所有属性键
public List<string> AttributeKeys {get{return _attributeKeys;}}
private List<string> _attributeKeys;

// 存储表中的所有数据对象
private Dictionary<string,CSVObject> _dataObjDic;
}

多张.csv格式的表存放在StreamingAssets目录下,所经历的过程是这样的:

  1. 在对应目录下有一个名为filePath.txt的文本文件,里面按行存储着所有数据文件(.csv)格式的具体路径
  2. DataManager读取filePath.txt文件,逐行检查描述的路径中是否存在对应文件,如不存在则报错
  3. 检查无误后,DataManager遍历上述路径中的文件,调用CSVTable中的CreateTable方法,将其数据转换成CSVTable格式
  4. CreateTable中逐行对数据进行拆解,生成CSVObject,即单行数据
  5. CSVObject唯一的标识符为主键(ID),根据主键来获取单行数据,再根据具体的键名来获取对应的值
  6. filePath.txt的更新借助UnityEditor的一个脚本写入