【插件】轻量级响应式本地数据库插件使用分享

补充 是想问key是否有字面量联合类型的约束 以及value有没有对应key的类型约束 比如name就是string hp就是number

1.这个没看明白你说的啥

2.持久化是不繁琐,繁琐的是把数据管理起来。
你举例的xxx请问怎么管理好,你不汇总一起存,那每个怪你存一个“键”,这些“建”你得知道对应的数据是啥吧。

举例子可以具体点吗,你这个例子也说明不了什么,关键的地方都是xxx。你用接口存也没什么问题,我们现在讨论本地化存储。服务器还不是用的数据,cocos很多都是小游戏,很多时候并不需要服务器。

3. 不放一起存也能做,还是那个问题,怎么管理。不是实现了就可以,还得考虑维护问题。
这里xxx类实例化后,每一个实例都有自己的 data 对象。你是想给每一个实例都存一个localStorage key吗?

那假如你这xxx类是我举例里的Monster,该关卡有100个怪,你就有100个Monster的实例,对应100个data对象。请问你如何很好的处理这100个data对象的持久化?存到localStorage里面后,下次启动游戏你又如何能很好的把这些data变成你的100个Monster实例。
这里也很好的应证了你第二点说比较关键的xxx如何处理。

4.我一开始就说了这种方式我认为并不好用
excel最终还不是变成json。excel编辑了得重新转成json,然后项目里加载数据。这个过程你不觉得繁琐吗?游戏数值需要经常调试修改,例如某个怪的血量你一次就能设计好写多少吗?肯定不能。反复调试的话,就需要频繁做这些步骤,所以简化流程有必要性。而且你excel也不能实时生效吧。

再来说插件,直接在cocos creator编辑器里面就可以修改数据,而且修改数据实时生效,可以立马看到跑起来的效果。数据导入导出都很方便,都是json字符串,程序里面直接可以加载。

再来回答一下你说的离开插件怎么从外部写入数据的问题。还是excel那套方式,先编辑excel。然后写一个excel到json的脚本,然后把json给到tinybase。也很简单,就一行代码 store.setContent(xxx); 其中xxx就是你转过来的json。唯一一点就是这个json需要按照tinybase的格式来。

有的,我例子里没有体现。tinybase默认类型是Cell,也就是string | number | boolean | null。如果需要具体指定类型,参考代码如下。

啊这 虽然都用代码维护是挺好的 但是我还是习惯一个json一个interface

不过非常支持新技术进场 有机会学习一波

你用的方式,对象可以用,对象可以用的方式,你不能用,所以你认为你的方式的优势是什么?你给出的任何一种优势,我都可以使用对象做到。

对象可以选择分开存储,也可以选择合并存储,这很自由,完全取决于开发者,例如存储数据是一个数组,那么就是放在一起存储

你的方式是开发过程中永久性的繁琐,而直接使用对象是一次性的繁琐,前面写好了方法就不需要做什么了,

而 creator 内是通过 npm 包能直接读取 excel 做到实时更新,反而你的方式怎么做多人协同开发?excel 有差异对比工具,你的有吗?

工具并不是越复杂越好,当用最少的代码实现相同甚至更多的功能时,那么高下立见

1赞

关于这点我想我可以说一说 之前有写过直接加载excel文件 在调试数值阶段我觉得很有用 直接在excel上改

1赞

其实我还想问一下楼主 如果关卡里是1000条数据该怎么写 setTable写1000行吗 那这个数据是由谁来配置和维护的 :rofl:

如果一千条数据是有规律的,直接用一个循环,一条条写就行了。但是如果不是又规律的,例如一千个怪,每一个怪的数值都需要精心设计,那肯定就人工写了。用excel应该也是一样的道理吧,假如是有一定规律的数据,excel不知能能不能类似写个循环脚本的方式去处理。反正能用我们熟悉的js去写肯定是更简单。

1.优势我已经说了,方便管理数据。数据库最大的优势不就是管理数据吗。
你说用对象能做的,我这个方式不行,不理解,请举例。

tinybase底层就是用的js对象做的,你对象能做的,人家封装一下就不能了?确实无法理解。
当然,假如你完全没有数据持久化的需求,用对象也没啥大问题。但是有持久化需求的哈,就没必要重复造轮子自己写一堆代码了,人家就做得挺好。

我再举一个你自己很难做到,而用tinybase却很容易的例子:
假如我需要做一个主角可以操控时间的游戏,也就是可以回到过去。如果用tinybase可以的Checkpoints实现,具体效果可以看官方案例。


你自己实现撤销功能也不是不行,就是要掉不少头发。

2. tinybase可以创建多个store,也可以分多张表存,也很自由
还是那个道理,人家底层用的也是js对象实现的。你说的人家都能做到,只是沿用数据库的思想封装了一套api给你用而已。

3.通过我上面举的简单例子可以大致判断,我这种方式在开发过程中并不比你用对象繁琐多少。
因为tinybase用的是数据库思想,所以对游戏开发来说可能有些代码比较繁琐,但是也是可以自己封装几个方法来把常用的代码简化一下的。

打个比方,游戏里有100个怪物实例,你是管理这100个怪物实例简单,还是管理一张怪物表简单。况且tinybase封装了很多针对表的操作查询方法。而且这100个怪物实例是运行时创建的,请问你如何在运行时很好的知道没一个怪的当时属性值是多少。而tinybase只需要查表打印即可。我这个插件简化了这个步骤,直接从插件里就可以直观看到结果。如果你做过前端开发,对这种工具应该不陌生,感兴趣可以查一下Vue Dev Tools是怎么做的。用过你就知道,你这种方式有多古老。

4. 关于多人协同开发,也很好解决
tinybase提供了基于时间的可合并store,调用merge方法就可以把两个store合并。我插件里面也是这么把项目里的store与插件里的store进行合并的。具体例子看官方代码。


例如,你同事写了一套自己的数据。你让他导出json给你,你拿到json新建一个store,把这两个store合并就行了。假如某个表的某一行你跟他都修改过,合并的效果是取最后修改的那个人的值。
相反,你用excel也没办法两个人同时改一个excel吧。

我只能说你把数值策划想简单了 规律?规律自然有 但并不只是一个字段一个公式拉表拉下来 有可能分段 也有可能引用其它列或者错行 甚至引用其它表

舔表仔:是时候展示实力了 看我一手多表联调 :rofl:然后引用崩了

那么我举例一个最简单的,通过对象监听,可以做到在修改对象任一属性时,同时做其他操作,例如持久化,调试

import mk from "mk";

const temp = { a: 0, b: { c: "1" } };

mk.monitor.on_recursion(temp, (value, old_value, path_s) => {
	console.log(`路径: ${path_s}, 新值:${value}, 旧值${old_value}`);
});

// 修改数据
temp.a = 1;
temp.b.c = "2";

image

请你做个相同的功能,在我对对象属性赋值时,能够持久化数据,注意,是赋值,而不是 setXXX, getXXX 等系列函数

引用其它表不就是连表查询吗,数据库常规操作。引用其它行或者列我没想到怎么弄。

另外,至于你说的 checkPoints 功能,只需要一个克隆对象的函数就可以搞定,所以有什么麻烦?

这种例子我上面列了很多了,我就再列一个简单的。

const store = createStore().setValue('a', 0);
store.addValueListener('a', (store, valueId, newValue, oldValue) => {
    console.log(`valueId: ${valueId}, 新值:${newValue}, 旧值${oldValue}`)
})

store.setValue('a', 2);

这里用setValue跟你这里赋值是一样的,tinybase操作数据都是用的函数,并不能直接操作数据。

当然你这个例子肯定是你这种写法更简单,因为这里只体现了响应式的数据这一个特性。

像连表查询,数据回滚请问你怎么做。你这个库也就实现了自动给对象添加set,get方法,在里面调用传进去的回调函数。但凡需要其它功能就得自己写了,所以我说你这个用在简单项目上没问题呀。

所以我说了你的是使用时复杂。而回滚数据更简单,只需要存储记录点再还原就行了,5行代码内就可以搞定,只是大部分游戏不需要这个功能,所以我没做

而且用上面的工具做很简单,并不复杂,所以我认为只要有半年经验程序员都能写出来

对于你的表查询,使用数组类型即可,而且使用数组的筛选函数比你的查询方式更简单

功能都能做,有什么不能做的?

你自己写一下就知道简不简单了,你去看人家源码就行了。人家实现起来几百行代码,你这里一个cloneDeep就完事儿了是吧。

照你这样,我也不需要用cocos了,引一个碰撞库,用html+js就可以做一个简单的2d游戏了。cocos的很多功能我自己也能做,那还用它干啥。

数据少且简单就直接用你这种差不多了,数据多且复杂用数据库,这有什么问题呢?

在实现相同功能的情况下,选择代码更多的方式是你的自由:+1:t2:

数据库查询可以级联 但是你在配置数据的时候 比方说某张地图的某个怪物的属性 我配置的时候是要和某个等级的人物的属性挂钩 那关联的可就复杂了

另外数值策划在配表的时候引用其它行其它列其它表的数据都是常规操作了 复杂的情况肯定是用excel导表不用想 美术用ps还能切图给程序不至于一整个psd文件丢过来 但是策划能提供的也就excel表转json给你了 至于说调试数值繁琐的问题上面给过答案了 可以直接解析excel(仅测试环境调试数值 正式环境最终还是要转json)

好吧,我大概理解你的意思了。我想的是一个人开发的时候需要在游戏里面快速修改数值,来测试数据是否合理。整个过程一个人做,那在游戏里面随改随生效并且立马可测试,肯定更高效。如果是专门有数值策划直接在excel里面就基本把数值设计好了,给到程序基本直接用,偶尔需要微调,那就不需要我这种方式了。

你这个例子实现起来简单,就能说明实际应用到项目就你这个更简单吗。

看菜下饭不就行了,要是写一个俄罗斯方块,就直接写代码了。几个变量就搞定了,啥都不需要。那我是不是也可以说,你这样复杂了,可以用变量实现?实现回退也简单,多定义几个变量就完事儿了。查询也简单,直接拿就行了 :joy:

都是工具,选择最合适的就行了,没什么好争辩的。

1赞