守望先锋地图工坊应用观察者模式思想教程 地图工坊进阶教程( 二 )


修改玩家变量(事件玩家, A, 加, 1)
// 这里写等级变化的逻辑
等待(0.016, 无视条件)
如条件为“真”则循环

守望先锋地图工坊应用观察者模式思想教程 地图工坊进阶教程


观察者2
1.事件:持续 - 每名玩家
2.条件:玩家变量(事件玩家, B) < 0
3.动作:
修改玩家变量(事件玩家, B, 加, 100)
修改玩家变量(事件玩家, A, 减, 1)
// 这里写等级变化的逻辑
等待(0.016, 无视条件)
如条件为“真”则循环
注意:
一定要注意逻辑设计上不能存在死循环 , 例如上面的例子里 , 观察者2的条件不能写“玩家变量 <= 0” 。因为当玩家经验=100时 , 观察者1会将其变为0 , 就会触发观察者2 。而观察者2又会再次触发观察者1 。这就导致了死循环的出现 。
我们在两个观察者最后都加上了循环 , 目的是打破条件满足的情况 。考虑这种情况:当我们一次性给玩家增加300点经验时 , 按理来说 , 应该让玩家升3级 , 但因为我们没有循环 , 玩家升了一级就结束了 , 并且后续增加经验 , 也不会再触发升级 。只有当条件满足被打破时 , 条件再次满足 , 才会再次触发该规则 。
守望先锋地图工坊应用观察者模式思想教程 地图工坊进阶教程



模拟函数调用
编程总是免不了函数 , 但目前为止OW中没有函数 。但是 , 我们可以使用上面的方法 , 来模拟函数 。
还是用上面的例子 。你会发现我们的等级变化逻辑还是写了两遍 。我们能不能再将其独立成一个规则?当然是可以的 。我们变化的目标是玩家 , 因此我们需要使用一个玩家变量 , 来标记我们需不需要对此玩家执行等级变化逻辑 。假设我们使用玩家变量C 。
首先 , 在游戏初始化的时候 , 将其设置为假 。我们的规则就可以变成:
观察者1
1.事件:持续 - 每名玩家
2.条件:玩家变量(事件玩家, B) >= 100
3.动作:
修改玩家变量(事件玩家, B, 减, 100)
修改玩家变量(事件玩家, A, 加, 1)
等待(0.016, 无视条件)
如条件为“真”则循环
设置玩家变量(事件玩家, C, 真)
守望先锋地图工坊应用观察者模式思想教程 地图工坊进阶教程


观察者2
1.事件:持续 - 每名玩家
2.条件:玩家变量(事件玩家, B) < 0
3.动作:
修改玩家变量(事件玩家, B, 加, 100)
修改玩家变量(事件玩家, A, 减, 1)
等待(0.016, 无视条件)
如条件为“真”则循环
设置玩家变量(事件玩家, C, 真)
等级变化规则
1.事件:持续 - 每名玩家
2.条件:玩家变量(事件玩家, C) == 真
3.动作:
// 这里写等级变化的逻辑
设置玩家变量(事件玩家, C, 假)
注意:这里只是模拟函数调用 , 但实际上它比函数还是少很多东西 。因此 , 并不是所有情况都适合这样写 。
守望先锋地图工坊应用观察者模式思想教程 地图工坊进阶教程


总结
本文其实并没有用什么很稀奇古怪的技术 , 但本文的难点是思路的转变:你需要将几个本来不相同的逻辑 , 找出他们的共同点 , 并巧妙的将其拆分成多个逻辑 , 然后用规则来实现 。
到底要不要使用这种方式来设计规则?你需要考虑它的优缺点 。
优点有:将重复的内容独立出来 , 减少工作量 , 方便以后的修改(不仅需要修改的地方少了 , 漏改的可能性也更小了) 。

推荐阅读