文章目录

  • 1. 配置Luban并测试
  • 2. Luban 数据加载原理
  • 3. 根据工程进行懒加载优化
    • 3.1 增加公共接口与接口实现方法
    • 3.2 外部提供获取数据的方法
    • 3.3 对Luban中的导表模板进行修改
  • 4. 优化后测试

如果初入坑,Luban配置可以参考宝鱼大佬的视频教程 强力配置工具luban使用教程【01】

或者查看官方文档 快速开始Luban

1. 配置Luban并测试

我这里是已经配置好的unity工程,数据使用的是官方案例里的 MiniTemplate。为了方便演示,除了生成一份C#代码之外,额外生成一份Json数据。

--gen_types code_cs_unity_json,data_json  ^

代码生成后,自定义增加一个Test脚本进行测试

using System.IO;
using cfg;
using UnityEngine;
using SimpleJSON;public class Test : MonoBehaviour
{void Start(){Tables tab = new Tables(Loader);foreach (var n in tab.TbItem.DataList){print($"ID:{n.Id};名称:{n.Name};描述:{n.Desc}");}}private static JSONNode Loader(string file){string path = "Assets/Res/Datas/" + file + ".json";return JSON.Parse(File.ReadAllText(path, System.Text.Encoding.UTF8));}
}

控制台看到如下输出,说明Luban已经配置ok。

在上面的测试代码里,可以看到当我需要使用Excel数据时,得先去new一个Tables对象,然后通过对象小数点后ClassName.DataList 或者 ClassName.DataMap 拿到我想要的数据。除此之外,new Tables() 在构造时还需要传入一个装载器,这个装载器去获取数据源与tables里的各个类对象进行匹配

2. Luban 数据加载原理

需要了解Luban加载数据的工作原理,我们就需要先来看一下 Tables 的构造方法(Tables.cs时自动生成的脚本,在导出目录根路径下)

下图是默认模板导出的Tables类,如果你没有使用自定义模板,应该和我一样。

下图是TbItem表 (表示整张表)内的构造函数

下图是Item类(表示每一行数据结构)生成后的构造函数

圈重点,通过上面的三个构造方法,可以得知导表后:

Tables会将已经生成好的表对象(本案例指TbItem)作为自己的一个参数,在构造时通过Loader回调加载源数据的方式(生成的Json数据或者二进制数据)去遍历表中每一行装载数据

现在只导入了一张表,如果多张表Tables会做什么呢?不妨多加几张表来看看。

如上图,我在__tables__.xlsx 中新增了两张测试表并导出,再来看一下 Tables 的构造方法。

Tables中的对象增加了,也就是说在new Tables时,它会全量加载,把所有的表对象都new一遍,获取源数据一对一装载,并把他们以表名为key的方式添加进字典里。

目前来看,Luban的数据加载方式需要我们在数据管理类中持有Tables对象,并且在具体使用到某张表数据之前进行Tables的预加载。

3. 根据工程进行懒加载优化

由于luban功能强大,所以全量可以支持它这么做。但是对于一般的工程来说,尤其是在游戏开发中拥有海量的数据源,我在初始化时全量加载反而弊大于利,并且为了方便数据管理和程序调用,也用不到那么多的功能。基于此,这里我们可以把这种预加载方式修改为懒加载。

3.1 增加公共接口与接口实现方法

定义一个VO接口,内部提供一个数据加载的方法,我这里传入json.text,可自定义。

public interface IVOFun
{void _LoadData(string data);
}

对每一个生成的表对象,让他们继承IVOFun接口,并在其内部实现_LoadData方法

这里以默认unity_json案例中的TbItem为例,在它内部实现LoadData

public void _LoadData(string data)
{JSONNode _json = JSON.Parse(data);foreach(JSONNode _row in _json.Children){var _v = item.Item.DeserializeItem(_row);_dataList.Add(_v);_dataMap.Add(_v.Id, _v);}PostInit();
}

3.2 外部提供获取数据的方法

在工程中你需要获取数据的地方添加新增Get数据的方法,我这里使用的资源加载方式时Addressables,代码实现原理都一样,根据自己情况只是获取数据源Data的方式不同,但需要注意的是这里应该使用异步加载与拿到data后释放资源

这里的思路是定义一个字典 Dictionary<源数据名称,数据对象>,需要加载数据对象时先从字典中获取,如果没有再new并加载数据后存入字典中。

private const string VO_DATA_PATH = "Res/Datas/";
readonly Dictionary<string, object> tables = new Dictionary<string, object>();private TextAsset ReadData(string path)
{AsyncOperationHandle<TextAsset> op = Addressables.LoadAssetAsync<TextAsset>(path);TextAsset res = op.WaitForCompletion();Addressables.Release(op);return res;
}public T GetVOData<T>(string fileName) where T : IVOFun, new()
{var path = VO_DATA_PATH + fileName + ".json";if (tables.ContainsKey(fileName)){return (T)tables[fileName];}else{var data = new T();TextAsset text = ReadData(path);data._LoadData(text.text);tables.Add(fileName, data);return data;}
}

这样一来,便可以在工程中任何节点加载需要使用到的资源。DataManager.Instance 是你提供获取数据方法的地方,我这里是一个单例类。

TbItem vo = DataManager.Instance.GetVOData<TbItem>("itemdata");
var infos = vo.DataList;
foreach (var n in infos) print($"{n.Name}/{n.Desc}");

当然 GetVOData 也可以完全不需要传入数据源的文件名称,这一步骤可以将接口的 _LoadData 方法修改为不需要传参,让各个表内部自己去获取与自身绑定的数据源。

传参可以额外让两份相同的结构的数据使用同一个表对象,不传参也可以更加便捷,让程序更多的关注在数据使用方面,而不是还需要额外知道数据源的文件名称。这里只是提供一种思路,可以根据自身的使用情况去自定义内部实现。

基于此,已经完成了懒加载步骤的70%,剩下的步骤需找到与模板相对应的文件目录对表定义进行修改。我这里的生成模板是code_cs_unity_json,所以来到Luban.ClientServer/Templates/config/cs_unity_json目录(该目录下存放了unity的C#脚本生成模板)。如果你是C#二进制模板,应该前往cs_bin目录。

3.3 对Luban中的导表模板进行修改

截图时,我把行号也截图进去了,修改的位置大致在截图中行号附近。其他类型修改位置还需要自己去详细看一下模板定义。

第一步:修改 tables.tpl

在命名空间与表名之间增加上面定义的接口 IVOFun


除此之外,还可以去掉冗余代码,将Tables的构造方法置为空。

替换后代码如下图所示:

第二步:修改 table.tpl

在类名后增加继承接口 IVOFun

修改table构造函数

在末尾增加接口实现方法

至此,已经完全完成了懒加载的修改,可以重新导出脚本了。

4. 优化后测试

完成第3节后,需要重新导入一次,我这里新建一个测试脚本。

using cfg.item;
using UnityEngine;public class LazyTest : MonoBehaviour
{void Start(){TbItem vo = DataManager.Instance.GetVOData<TbItem>("itemdata");var infos = vo.DataList;foreach (var n in infos){print($"{n.Name}/{n.Desc}");}}
}

运行游戏,可以看到控制台成功打印信息。


Author:文若
DataTime:2022-11-16

Unity导表工具Luban插件的数据加载原理与优化相关推荐

  1. Unity导表工具开发(一)

    Unity导表工具开发(一) Unity导表工具开发(二) Unity导表工具开发(三) Unity导表工具开发(四) 在进行Unity游戏开发的时候,会遇到很多配置表导出到项目的情况,这边开发一个导 ...

  2. Hive表路径修改和分区表数据加载命令

    1.对于同一张表,如果不是分区,那要变更数据来源,就只有改变其hdfs存储路径: 修改tmp_fjs_ftp表的location,两种方式: 方式一:通过修改表DDL alter table tmp_ ...

  3. 利用shell脚本结合hive语句进行数据加载时的优化

    把hdfs上的文件加载到hive分区表 version0.1:遍历目录下的所有文件,逐个文件加载,循环次数多,单个文件加载不利于发挥系统io性能 for file in `hadoop fs -ls ...

  4. ETL 数据加载机制概述

    ETL 是数据抽取(Extract).转换(Transform).加载(Load)的简写,它的功能是从数据源抽取出所需的数据,经过数据清洗和转换,最终按照预先定义好的数据仓库模型,将数据加载到数据仓库 ...

  5. hive外部表改为内部表_3000字揭秘Greenplum的外部数据加载——外部表

    外部表是greenplum的一种数据表,它与普通表不同的地方是:外部表是用来访问存储在greenplum数据库之外的数据.如普通表一样,可使用SQL对外部表进行查询和插入操作.外部表主要用于Green ...

  6. oracle批量加载,Oracle教程:使用SQL*Loader高速批量数据加载工具

    Oracle教程:使用SQL*Loader高速批量数据加载工具 1.控制文件中包含要加载的数据 首先创建一张测试表 然后创建一个控制文件(其中包含被加载的数据) 然后在命令行执行加载 查看dept表 ...

  7. hive 导入hdfs数据_将数据加载或导入运行在基于HDFS的数据湖之上的Hive表中的另一种方法。

    hive 导入hdfs数据 Preceding pen down the article, might want to stretch out appreciation to all the well ...

  8. hive内部表和外部表的区别_3000字揭秘Greenplum的外部数据加载——外部表

    外部表是greenplum的一种数据表,它与普通表不同的地方是:外部表是用来访问存储在greenplum数据库之外的数据.如普通表一样,可使用SQL对外部表进行查询和插入操作.外部表主要用于Green ...

  9. Hive的基本操作-表结构修改和数据加载

    分桶表 将数据按照指定的字段进行分成多个桶中去,说白了就是将数据按照字段进行划分,可以将数据按照字段划分到多个文件当中去 开启 Hive 的分桶功能 set hive.enforce.bucketin ...

最新文章

  1. Android源代码获得方法
  2. Opencv 图片融合 addWeighted性能测试
  3. 利用CSS实现文本省略效果
  4. linux 修改分辨率lcd_16.Linux-LCD驱动(详解)
  5. JavaScript中的Window窗口对象【转载】
  6. JSON字符串封装成Bean对象/JSON串反序列化成实体类对象/JSON字符串转换成Java对象
  7. [机器学习笔记]Note5--归一化
  8. python写剧情文字游戏_文字游戏引擎试用心得之一:Ren'py 和 Fungus
  9. 第二阶段冲刺 NO.2
  10. vim插件ctags的安装和使用
  11. MATLAB绘图函数ezplot入门详解
  12. 学Excel,一辈子这门课就够了
  13. Table is marked as crashed and should be repaire (
  14. DreamweaverCS6 破解补丁和说明
  15. redis灵魂拷问:聊一聊zset使用
  16. 谜语(发送给你的爱人吧)
  17. windows自带的比微信好用的截图工具:截取任意形状图片,标尺画直线,窗口图精准截取
  18. Git安装(傻瓜版)
  19. .net 汉字转拼音 - 输入汉字获取其拼音
  20. 与MySQL的第一次亲密接触

热门文章

  1. Android横竖屏屏幕方向设置
  2. Installing Oracle11g R2 RAC on RedHat Linux AS 5.5
  3. pox.xml有些包下载不了的原因
  4. win10系统如何连接宽带连接服务器,Win10系统如何连接宽带上网?,爱纯净官网
  5. 虚拟机VMWare Workstation最新官方原版 有效VMware7.1.4序列号 密钥 VMware7.1.4破解版破解方法 VMware7.1
  6. 关于开源的RTP——jrtplib的使用(2)
  7. 第十六届D2大会(I)
  8. 【特征检测】BRISK特征提取算法
  9. kettle下载百度网盘地址含入门教程2(文本/EXCEL的导入导出)
  10. ADC采样时间、采样周期、采样频率计算方法