【编程】游戏开发中常用的编程模式整理
有机紫菜
2024年05月24日 09:55

游戏编程开发中,有一些非常常用的基础招式和组合技(编程模式)

每一种都有其应对的开发情况.

可以说,将这些基础招式和组合技,烂熟于心后,

对各种开发情况会有一个大致的思路.提升整体开发水平.

---当然,一般更高级的开发者,会将这些融汇贯通后,再将其定义忘记,而做到随心所欲.

常用的组合技,招式

基本招式.

  • 封装.继承,虚函数,构造函数,接口,封装,抽象,复写.分摊.

组合技(编程模式)

  • 原型模式---克隆物体,常常用在复制士兵,道具等.

  • 构造器模式---player = new Player("Player One", 100);使用构造函数,构造物体

  • 命令模式---把一些请求,或者Input封装成为命令的形式.

  • 修饰器模式---常用在数据密集的地方,任务系统,道具装备系统.武器技能系统.不想修改原有类,还想增加功能,比如武器的模块系统之类的.

  • 桥接模式,---桥接模式可以比喻为角色携带的武器、装备和宝石之间的关联。就像是角色拥有一本魔法书,武器、装备和宝石都是书中的不同章节,通过翻阅不同的章节(即使用不同的武器、装备和宝石),角色可以展现出不同的能力和特性。而魔法书就是桥接器,它将武器、装备和宝石这些独立的元素连接起来,使得角色可以根据不同的战斗情境,选择和搭配最合适的章节(即武器、装备和宝石),以发挥出最大的战斗力。

  • 单例模式---常用在管理器里面,场景管理,物品增删改查管理。

  • 备忘录模式---在不违反封装的原则下,获取一个对象的内部状态并保留在外部,让对象可以在日后恢复到原先保留时的状态。

  • 外观模式---也就是整合简化,通过一个按钮,控制很多复杂的系统内容自动进行---它能将系统内部的互动细节隐藏起来,并提供一个简单方便的接口.之后客户端只需要通过这个接口,就可以操作一个复杂系统并让它们顺利运行

  • 大局FSM---大局的部分,因为不会经常切换状态,所以用有限状态机比较合适.---大局是指游戏的大状态,比如,开始游戏,HUD页面,暂停,退出.死亡重来.

  • 全局事件系统---订阅模式,的应用.以及观察者模式的使用,

  • Unity通常功能的三段结构(普攻)---数据配置scriptableObject,初始化(so直接编辑器中),执行.

  • 工厂模式---抽象出一个工厂,然后生产啥,是士兵和坦克的逻辑不关心.

  • 策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并使它们可以互相替换。在游戏中的战斗系统、路径查找等场景中常用。---比如武器的投射物逻辑,单独封装.每个武器调用的规则不一样.不同角色使用不同的战斗逻辑.

  • UI管理模式---Unity中,ui的配置有的打开有的没有打开,应该有一个统一的管理.

  • 分摊模式---比如加载一个大的图标列表,可以将其分摊到Update中,每帧加载一点内容---携程当中判断一个队列是否完成,没完成就持续处理.

  • 空间模式---八叉树类型的处理空间部分的,比如光照探针,区域音效,以及遮挡剔除,都可以考虑用这种形式去处理

次要的组合招式.(不那么重要的模式)

  • 观察者模式---在观察者模式中,被观察的对象(称为“主题”)维护一个观察者列表,当主题的状态发生变化时,会自动通知所有注册的观察者对象。

  • 订阅模式---订阅事件与触发事件.

  • 命令队列模式(Command Queue Pattern):将一系列命令存储在队列中,按照顺序执行。在游戏中的任务系统、多线程任务调度等场景中常用。

  • 事件驱动模式(Event-Driven Pattern):基于事件和事件处理机制的模型,游戏中的用户输入、游戏事件等通常采用事件驱动的方式处理。

  • 适配器模式(Adapter Pattern):允许将一个类的接口转换成客户期望的另一个接口。在游戏开发中,可能需要适配不同的API或工具库。

  • 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问。在游戏中的网络代理、虚拟内存管理等场景中常用。

  • 备忘录模式针对网游的反外挂行为--游戏系统提供存取内部成员的方法,是让游戏系统处于“被动”状态,备忘录模式则是将游戏系统由“被动”改为“主动”提供意思是让游戏系统自己决定要提供什么信息和记录存盘功能也由游戏系统决定要从存盘功能中,读取什么样的数据及记录还原给内部成员

  • 分摊模式:使用队列,Queue加载一个推一个,携程当中写入

    • yield return new WaitForSeconds(1 / frameRate);---等待直到当前帧数达到设定的帧率,例如,如果你想要每秒播放 30 帧(frame rate of 30 FPS),那么 frameRate 变量应该设置为 30,而 1 / frameRate 计算出来就是 1/30 秒,也就是大约 0.0333 秒,或者 33.3 毫秒。这意味着协程将会等待 33.3 毫秒直到下一帧开始。

  • 使用队列,和携程,等待帧率到时在进行加载.**---携程当中判断一个队列是否完成,没完成就持续处理.

  • 注意.可以在**刷新列表方法中,开始一个携程.

  • 桥接模式---可视为两个类群组交互使用所引发的问题---融合问题.

  • 在开发中将两种角色与3种武器交叉组合,然后以上述方式实现,会存在以下两个缺点:

1. 每个继承自ICharacter角色接口的类,在重新定义Attack方式时,都必须针对每一种武器来实现(显示特效和播放音效),或者进行额外的公式计算.所以当要新增角色类时,也要在新的子类种重复编写相同的程序代码

2. 当要新增武器类型时,所有角色子类种的Attack方法,都必须修改,针对新的武器类型编写新的对应程序代码.这样会增加维护的难度,使得武器类型不容易增加