背景
现在在做的游戏中需要设计一个成就系统。实现成就系统不难,但是想要尽量将成就系统和游戏玩法解耦,保证更好的可拓展性,就需要一点设计。
以下是我实现任务或成就系统的想法。
基本结构
在这个设计中,添加一个成就的步骤:
(1)多创建一个组件类,写判断是否完成的逻辑
(2)在游戏实体中加入事件分发器,发送消息
(3)在组件中绑定事件,接受消息
(4)在成就系统中加入组件、
设计的好处
(1)添加新的成就的时候不需要动用原有的成就文件,方便源码管理和多人并行合作
(2)可以在本地确认成就无误之后再加入成就系统,提高代码安全性
(3)游戏核心玩法只需要发送消息,而不需要知道成就系统的类,最大程度上的减少了游戏玩法和成就系统的耦合
举例实现
实现一个统计跳跃次数,并且达到100次的成就
1.创建好成就组件
- 首先创建一个符合成就名字的组件
- 逻辑很简单,每次跳跃计数+1,达到100完成成就
2.创建事件分发器创建逻辑
- 创建好事件分发器,将他拖出来,选择call
- 在你需要和成就挂钩的逻辑后面加上这个call(这里只用于演示)
- 这样的好处是不需要删改原有逻辑,你也可以用一些方法将这个逻辑单独出来
3. 组件绑定事件
- 在组件一开始,就要获取能够发送消息的对象,使用bind接收消息
- UE可以同时bind好几个对象的事件分发器,所以这样子写也是完全可以同时接收的。
- 创建Bind的事件,并调用前面写好的判定逻辑
4. 创建成就系统加入组件
- 成就系统可以写在很多地方,可以写在Gamemode里面,也可以写Actor,严格来说他应该用单例模式设计才行。
- 将写好的组件放入成就系统进行调试
测试
- 两个球的跳跃都可以计数