|
发表于 2013-8-26 23:37:04
|
显示全部楼层
本帖最后由 Yuki001 于 2013-8-26 23:59 编辑
猴子的任务系统说的太好了.这样的机制非常灵活.没什么好挑刺的,只能补充说明下自己的理解了.
前面说的第一点核心思想,"You call me, I don't call you",其实是反向依赖,也就是回调机制.我们可以看下为什么需要用这个机制.就拿任务系统和道具系统的依赖来说
1.理论上,任务系统的判断条件依赖于道具系统中的道具.所以出来的依赖链就是
任务系统 ------- 依赖/检查 ------> 道具系统
2.任务系统对道具系统的依赖细节,更多的集中在onChange之上,而不是在get接口上,而且依赖的很多细节是道具系统的主动接口无法提供的.为了获得灵活和完整的功能,这时候就可以利用onChange的回调机制,将依赖反转
任务系统 <-------- 依赖/onChange回调 ------ 道具系统
3.但是道具系统在逻辑上,是不依赖于任务系统的,所以这个依赖反转需要将中间的依赖过程解耦.所以我们可以引人解耦中间机制
任务系统 --------> 中间机制 <------ 道具系统
解耦的中间机制有很多种,信号机制是一种,事件总线机制也是一种,加入中间层也是一种.一般如果写在代码里面,就会使用简单的信号或者事件机制.如果要支持外界配置.一般会用脚本或者做一个中间层机制.如果做脚本就会比较复杂了.
4.猴子这里选择的中间层系统是Tag机制,这套机制的优点很明显,就是支持使用表格配置,可利用字符串本身来进行逻辑功能.也可利用Tag本身作为变量计数,那结果就是
任务系统 --------> Tag 机制 <------- 道具系统
这样的话,道具系统的实现表中,就会加入一个或者多个Tag字段,标明这个道具的Tag,其中某一个Tag字段的含义是,道具入背包,TagA + 1
然后任务系统,一个任务目标会配几个Tag和对应的参数,例如 TagA,5,TagB,3,那么这个任务的完成条件就是 TagA >=5 and TagB >= 3,在TagA或者TagB改变的时候触发检查.或者直接提升任务进度.
建立了Tag机制之后,很多系统的依赖都可以通过Tag系统做中间层解决,例如任务系统和NPC系统,任务系统和怪物系统,成就系统和道具系统等等.所以猴子说利用Tag机制可以去掉很多表的依赖,做一个功能不需要动太多表.
另外第2点里面的例子,其实也可以通过Tag来做,把Tag看成一个变量,在道具表中配置一个丢弃触发Tag字段,道具丢弃时,TagDec + 1, 任务系统中配置任务失败条件 丢弃TagDec >= 3 判断失败.可以直接通过Tag中间层协调道具和任务系统来完成.不需要通过中间层的Buff系统来计数和执行逻辑.
|
|