游戏里成就系统可以使用观察者模式。要实现成就系统之前,一般需要企划单位先将需要的成就事件列出来,并在项目完成到某个段落之后,才开始加入实现开发中。
大致实现逻辑:
先定义“游戏事件”,如敌方角色阵亡、玩家角色阵亡、玩家角色升级等。当游戏进行过程中,有任何“游戏事件”被触发时,系统就要通知对应的“成就项目”,进行累积或条件判断,如果达到,则完成“成就项目”并通知玩家或直接给予奖励
比较简单的实现方式
比较简单的实现方式,就是直接在完成游戏事件,就通知成就系统
这里写个简单的代码
if finshed
AchievementSystem.NotifyGameEvent(xxx);
然后在成就系统中,通过枚举、字符串来判断是哪种事件,并传达相应的参数
然后在根据对应传入的函数参数再次执行对应的方法,以达到某种需求作用
需求如:累积属性或判断单词成就是否实现
为什么使用观察者模式来做成就系统?
如果让成就系统负责每一个游戏事件的方法,并针对每一个单独的游戏事件,去进行“成就项目的目的或判断”,会让成就系统的扩充被限制在每个游戏事件处理方法中。
当以后需要针对某一个游戏事件增加成就项目时,就必须通过修改原有“事件处理方法”中的程序才能达成。
例如:想要再增加一个成就项目“杀死装备武器为Rocket”以上的敌人数,那么只能修改Notify_EnemyKilled方法,在其中追加程序代码来实现修改的目标。
并且,“游戏事件”发生时可能不是只有成就系统会被影响,其他系统也可能需要追踪相关的游戏事件。因此,如果都是在“游戏事件”的触发点进行每个系统调用的话,那么触发点的程序代码将变的非常复杂。
所以要将“游戏事件”与“成就系统分开”,让成就系统仅关注于某些游戏事件的发生;而游戏事件的发生,也不是只提供成就系统使用,这样的设计才是适当的设计。
如何完成这样的设计?
如果能将“游戏事件的产生与通知”独立成为一个系统,并且让其他系统都能通过“订阅”或“关注”的方式,来追踪游戏事件系统发生的事。
即:当游戏事件系统发生时,会负责去通知所有“订阅”了游戏事件的系统,此时被通知的系统,再根据自己的系统逻辑自行决定后续的处理操作。
按上述流程来设计,其实就是观察者模式所要表达的内容
观察者模式的定义
GOF对观察者模式(Observer)的定义:
在对象之间定义一个一对多的连接方法,当一个对象变换状态时,其他关联的对象都会自动收到通知。