Unity游戏配置存储方案

文本存储+类配置(C#)

配置文件格式如下图
第一行是列类型说明,第二行是描述,第三行是对应属性名称,用于反射,之后行是实际数据
\r\n换行,\t分列,单元格内依次由+、|分割

longstringstring[]stringstringint
sid活动标题活动图片活动名字活动描述是否可见
idtittleiconnamedescvisible
1每日签到领取大礼签到2
8加官进禄jiaguanjinjue_close+jiaguanjinjue_open+huodong_bg加官进禄1

类结构样式

public class ActivityConfig : Config
{
	public readonly long id;
    public readonly string tittle;
    public readonly string[] icon;
    public readonly string name;
    /// <summary>
    /// 描述;
    /// </summary>
    public readonly string desc;
    /// <summary>
    /// 是否可见 (0 不可见,1 可见 由活动界面打开,2 可见 独立界面)
    /// </summary>
    public readonly int visible;
}

核心逻辑:将文本文件split后每行是一个lineData,以id进行索引;需要读取对应行数据时,反射创建对应类,反射赋值后返回
可选优化:获取数据时可以指定列,不用一次全部反射;当属性被赋值后,删除lineData中对应的原始键值对

...
Dictionary<string, object> lineData;
...
Config instance = Assembly.CreateInstance(configType.FullName) as Config;
FieldInfo[] fields = instance.GetType().GetFields();
FieldInfo field;
for (int m = 0; m < fields.Length; m++)
{
    field = fields[m];
    field.SetValue(instance, lineData[field.Name]);
}
...
return instance

二进制存储+类配置(C#)

与上诉方案基本相同,除了使用二进制替换文本,故读取原始数据的方法略有不同

ScriptableObject(Unity)

这是Unity中最快最省GC的方案(怀疑Unity直接使用memcpy之类手段在内存中从二进制还原成class),但是对热更新支持并不好,可以用于存储结构不会变化的配置

PBC(lua)

项目使用lua开发,故尝试了云风的pbc,使用与protobuffer区别不大
在解析时,pbc做了一些优化,如果是内嵌的结构,不会直接解出来
下方代码中,解析Person时name、id、email会直接解析,phone却不会解析,仍然是原始数据,直到真正用到才会解析

package tutorial;

message Person {
  required string name = 1;
  required int32 id = 2;        // Unique ID number for this person.
  optional string email = 3;

  message PhoneNumber {
    required string number = 1;
    optional int32 type = 2;
  }

  repeated PhoneNumber phone = 4;
}

pbc对多维数组支持不好,二维数组只能使用如下样式实现

  message arrInt {
    repeated int32 arr = 2;
  }
  repeated arrInt arrArrInt= 4;

解析后变成如下结构

arrArrInt = {
	{arr = {}},
	{arr = {}},
	...
}

需要额外操作才能转化为二维数组

lua文件

最终采用的方案,见这篇笔记

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值