[Notas de Unity] Aplicación de patrones de diseño en el desarrollo de juegos

Aplicación de patrones de diseño en el desarrollo de juegos

Recientemente, al estudiar la aplicación de patrones de diseño en el desarrollo de juegos , descubrí que, de hecho, pueden mejorar la eficiencia del desarrollo, especialmente en el ajuste y mantenimiento posterior del código.
Así que escribí este artículo y registré brevemente mi experiencia de aprendizaje, para que pueda inspirarme cuando lo revise en el futuro.

Aviso

  • Este artículo solo resume los posibles escenarios de aplicación de los patrones de diseño en el desarrollo de juegos basados ​​en libros y materiales de Internet, y no explica los principios de los patrones de diseño.
  • En las aplicaciones prácticas, normalmente hay casos en los que se utilizan varios patrones de diseño combinados. Este artículo está clasificado por patrones de diseño, y habrá situaciones en las que el mismo escenario de uso aparezca en múltiples patrones de diseño.
  • En el desarrollo real, algunas funciones pueden tener otros métodos de implementación, o algunos patrones de diseño pueden tener otros escenarios de aplicación. La lista de este artículo puede ser incorrecta o no ser lo suficientemente completa. Sus correcciones y adiciones son bienvenidas.

Patrones de diseño creacional

1. Único

El patrón singleton se usa ampliamente en el desarrollo de juegos. El patrón singleton garantiza que solo haya una instancia de una clase y proporciona un punto de acceso global para obtener esa instancia.

Escenas a utilizar ilustrar
administrador del juego Responsable de procesar la lógica central del juego, como el estado del juego, el progreso del nivel, etc., se puede usar en combinación con el modo de apariencia
administrador de audio Ídem al efecto
administrador de interfaz de usuario ídem
Varios administradores de módulos ídem
persistencia de datos ídem
Cliente de juegos en línea Use el modo singleton para limitar la cantidad de conexiones, evitar que el uso indebido genere demasiadas conexiones y evitar fallas en el lado del servidor
herramienta de registro -

Aunque el modo singleton es conveniente, debe usarse lo menos posible:
"El modo singleton también viola el principio de apertura y cierre, porque el objeto obtenido a través del método Instance es la clase de implementación en lugar de la clase de interfaz. Por lo tanto, cuando el diseño cambia o los requisitos aumentan, el diseñador de programas no puede ser reemplazado por otras clases, pero solo se puede cambiar el código del programa en la clase de implementación original, por lo que no se puede cumplir con el requisito de cerrar la modificación". —— "Patrones de
diseño y perfecto desarrollo de juegos"

El patrón singleton se puede utilizar para modularizar el código.El uso directo del patrón singleton (Singleton) puede generar confusión en el código y dificultad en el mantenimiento porque no hay restricción de acceso.
Un patrón singleton completo debería aumentar las restricciones de acceso. Por ejemplo, se introduce el contenedor IOC (Inversion of Control) para lograr el efecto de un modo singleton con restricciones de acceso consultando el diccionario.
Si compara el marco del código del juego con la instalación y la instancia única con las líneas de conexión de varios módulos importantes, la introducción de un contenedor IOC es equivalente a agregar un "administrador de cables" (muchos otros patrones de diseño también tienen esta función).
El uso del contenedor IOC puede escribir fácilmente código que se ajuste a los principios de inversión de dependencia (D) y responsabilidad única (S).


2. Patrón de método de fábrica (Método de fábrica)

El patrón del método de fábrica proporciona una forma de separar la creación y el uso de objetos Al definir una interfaz de fábrica, las subclases pueden decidir qué objetos específicos producir.

Escenas a utilizar ilustrar
generación de personajes Al usar el patrón de método de fábrica, puede definir una interfaz de fábrica de roles y luego implementar clases de fábrica específicas para cada tipo de rol (como jugadores, enemigos, NPC, etc.), que se pueden usar con el patrón de construcción.
generación de herramientas Puede definir una interfaz de fábrica de utilería y luego implementar clases de fábrica específicas para cada tipo de utilería (como armas, armaduras, consumibles, etc.)

3. Patrón de fábrica abstracta (Fábrica abstracta)

El patrón Abstract Factory proporciona una interfaz para crear una serie de objetos relacionados o dependientes sin especificar sus clases concretas. El sistema puede decidir qué grupo de subclases producir de acuerdo con el entorno de ejecución actual.

Escenas a utilizar ilustrar
carga de recursos Al usar el patrón de fábrica abstracto, puede crear clases de fábrica correspondientes para diferentes tipos de recursos, a fin de lograr una interfaz de carga de recursos unificada
creación de interfaz de usuario Se pueden proporcionar diferentes clases de fábrica de interfaz para ayudar a realizar la reutilización y personalización de los componentes de la interfaz de usuario.
generación de nivel Puede crear una clase de fábrica para diferentes tipos de nivel (como bosque, desierto, ciudad, etc.), que contiene diferentes contenidos y elementos generados, y puede usar el patrón de fábrica abstracto al agregar nuevos tipos de nivel.
generación de herramientas Ídem al efecto

Patrón de fábrica abstracto y patrón de método de fábrica

Patrón de fábrica abstracto:

  • Clase de fábrica abstracta - * Interfaz de fábrica - * Clase de implementación de fábrica - * Producir productos
  • Fácil de expandir, no fácil de modificar.

Patrón de método de fábrica:

  • Interfaz de fábrica - Clases de implementación de fábrica - *Producir productos
  • Es fácil tener demasiados productos nuevos y hacer que la fábrica explote

(* indica que puede haber más de uno)


4. Modo constructor (Constructor)

El patrón constructor separa el proceso de construcción de un objeto complejo de su representación, de modo que el mismo proceso de construcción puede crear diferentes representaciones de objetos. (montaje paso a paso)

Escenas a utilizar ilustrar
generación de personajes Los personajes se pueden crear en pasos y proporcionar diferentes combinaciones (como atributos, habilidades, efectos especiales, comportamientos de IA, etc.), lo que permite una creación de personajes flexible
generación de nivel El proceso de creación de mapas se puede dividir en pasos, cada paso es responsable de procesar un elemento específico del mapa (como terreno, edificios, accesorios, etc.)
generación de herramientas Los accesorios y el equipo se pueden crear en pasos (como poder de ataque, poder de defensa, durabilidad, etc.), proporcionando combinaciones flexibles

5. prototipo

El patrón Prototipo crea nuevos objetos copiando objetos existentes (prototipos), en lugar de hacerlo mediante métodos de construcción tradicionales.

Escenas a utilizar ilustrar
Carga de recursos del juego GameObject.Instance en Unity es un patrón prototipo

Patrones de diseño de comportamiento

6. Modo de estado (Estado)

El patrón State permite que un objeto cambie su comportamiento cuando cambia su estado interno.

Escenas a utilizar ilustrar
gestión del estado de roles Administrar el estado del rol. Para estados como estar de pie, correr, saltar, patrullar, atacar, etc., al usar el patrón de estado, la lógica y el comportamiento de cada estado se encapsulan en una clase separada, lo que hace que la lógica de cambio entre los estados de los personajes sea más clara.
Cambio de nivel de juego o escena Administre el cambio de nivel y escena, comportamiento lógico
Menú del juego y gestión del estado de la interfaz de usuario Como el menú principal, la interfaz de configuración, el menú de pausa, etc. El modo de estado puede simplificar la lógica de conmutación entre estas interfaces, lo que hace que el sistema de interfaz de usuario sea más modular y fácil de mantener.

Modo de estado y máquina de estado finito (Finite State Machine, FSM)

El patrón de estado puede verse como una implementación orientada a objetos de una máquina de estado finito. Las transiciones de estado y el comportamiento de estado en una máquina de estado finito se pueden representar más claramente usando el patrón de estado.
En el desarrollo de juegos, el patrón de estado se puede utilizar para implementar máquinas de estado finito para administrar las transiciones de estado y el comportamiento de los objetos.


7. Modo mediador (Mediador)

El modo intermediario se utiliza para reducir el acoplamiento entre múltiples objetos y concentrar la interacción entre objetos en un "objeto intermediario" para su procesamiento. (centro de interacción entre múltiples subsistemas)

Escenas a utilizar ilustrar
Interacción entre subsistemas Se puede utilizar como un centro de interacción entre los subsistemas del juego.
sistema de interfaz de usuario El modo intermediario se puede utilizar para extraer la compleja relación de interacción de la interfaz de usuario de cada elemento de la interfaz de usuario y concentrarla en un objeto intermediario para su procesamiento.
interacción entre personajes La lógica de interacción, como los diálogos y las transacciones entre roles, se puede separar de los objetos de rol y se pueden introducir objetos intermediarios para su procesamiento.
sistema de eventos Concentre la lógica de procesamiento de eventos como la derrota de jugadores y la recopilación de elementos en un objeto intermediario para simplificar el proceso de publicación y suscripción de eventos (se recomienda el modo observador)

8. Estrategia

El patrón de estrategia permite cambiar dinámicamente el comportamiento de un objeto en tiempo de ejecución. Al usar el patrón de estrategia, puede encapsular un conjunto de algoritmos intercambiables en un conjunto de clases independientes, lo que simplifica su código y mejora la capacidad de mantenimiento y la extensibilidad.

Escenas a utilizar ilustrar
Cálculo de atributos de carácter Puede usar el patrón de estrategia para separar diferentes atributos y métodos de cálculo para modificarlos y usarlos fácilmente
generación de nivel Se pueden encapsular diferentes algoritmos de generación de niveles como un conjunto de clases independientes, y la estrategia de generación de niveles se puede cambiar dinámicamente según sea necesario en tiempo de ejecución.
Ajuste de dificultad del juego ídem

Patrón de estrategia frente a patrón de estado

"Estado es cambiar entre un grupo de estados, y existe una relación correspondiente y conectada entre estados; la estrategia se compone de un grupo de clases que no tienen relación y no conocen la existencia de las demás. El estado está limitado por el reglas de conmutación de la máquina de estado, en el
diseño Todos los estados posibles se definirán en la etapa inicial, incluso si se agregan más tarde, deben estar relacionados con los estados existentes, en lugar de agregarlos tan pronto como lo deseen; la estrategia es un patrón de diseño formado por la encapsulación de algoritmos informáticos, y no hay relación entre los algoritmos. Dependencia, se pueden agregar o reemplazar nuevos algoritmos de inmediato". ——
"Patrones de diseño y desarrollo perfecto del juego"


9. Método de plantilla

El patrón de método de plantilla define el esqueleto de un algoritmo en un método y abstrae algunos pasos repetitivos de subclases a superclases. De esta forma, los métodos de plantilla permiten que las subclases redefinan ciertos pasos de un algoritmo sin cambiar la estructura del algoritmo. (Proceso general)

Escenas a utilizar ilustrar
Carga de nivel La estructura básica de la carga de niveles (como la precarga de recursos, la inicialización de escenas, la carga de personajes, etc.) se puede definir en una clase base abstracta, y los pasos de carga específicos se pueden retrasar a subclases.
sistema de logros Puede usar el patrón de método de plantilla para definir una clase de logro abstracta, que contiene métodos básicos de verificación de logros e implementa una lógica de verificación de logros específica en las subclases.
Iniciar sesión en el juego en línea El proceso de inicio de sesión se soluciona a través del modo de método de plantilla, como mostrar la pantalla de inicio de sesión, seleccionar el método de inicio de sesión, ingresar la contraseña de la cuenta, enviar una solicitud al servidor, etc., para que la subclase de función de inicio de sesión pueda realizar operaciones específicas.

10. Modo de comando (Comando)

命令模式将请求封装为对象,将客户端的不同请求参数化,并配合队列、记录、复原等方式来执行请求操作。

使用场景 说明
交互逻辑 在MVC框架中,可以用于分担 Controller 层的交互逻辑,让很多混乱的交互逻辑代码从 Controller 迁移到 Command 中
操作记录 通过存储已执行的命令对象,可以轻松实现撤销和重做功能(如移动单位、放置建筑等)。可用于实时策略游戏和编辑器等场景
事件系统 可以将一系列事件通过命令模式封装起来,使其可以更灵活的调用

在凉鞋老师的框架中:

  • 事件由 系统层 向 表现层 发送
  • 表现层 只能用 Command 改变底层系统层的状态(数据)
  • 表现层 可以直接查询数据

11. 责任链模式(Chain of Responsibility)

责任链模式为请求创建了一个接收者对象链。这些接收者对象按顺序处理请求,直到其中一个处理了该请求为止。

使用场景 说明
关卡切换 可以设置各关卡切换条件,当条件达成时跳转到对应关卡。在通关判断上,可以配合策略模式,让通关规则具有其他形式变化
AI决策 将不同的AI行为链接在一起,让AI根据当前情况处理决策请求,从而实现灵活的AI行为控制

12. 观察者模式(Observer)

观察者模式定义了一种一对多的依赖关系,当一个对象(主题)的状态发生变化时,所有依赖于它的对象(观察者)都将得到通知并自动更新。

使用场景 说明
事件系统 可以实现一个全局的游戏事件系统,当某个事件触发时,所有订阅了该事件的对象都会收到通知并作出相应处理
成就系统 监测游戏中的各种事件(如角色升级、任务完成、特定敌人击败等),当满足成就条件时,自动解锁相应的成就并通知玩家

观察者模式 与 中介者模式

两者结构相同,但使用场景不同。
观察者模式可以理解为了使业务逻辑更加清晰,从中介者模式中分离出一种专门处理事件订阅与分发的设计模式(笔者的粗浅理解)。


13. 备忘录模式(Memento)

备忘录模式在不破坏对象封装的前提下,捕获对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

使用场景 说明
游戏存档 可以利用备忘录模式保存玩家的角色状态、关卡进度、游戏设置等信息
状态回滚 在角色受到负面效果或需要恢复到之前状态时,可以使用备忘录模式回滚角色属性
撤销操作 在游戏编辑器或游戏中的一些可撤销操作,可以通过备忘录模式记录并恢复对象的状态

14. 访问者模式(Visitor)

访问者模式可以定义一个能够在一个对象结构中对于所有元素执行的操作。访问者可以让你定义一个新的操作,而不必要更改到被操作元素的类接口。被访问者需要开放足够的操作方法和信息。

使用场景 说明
统计数据 在对游戏中的各种对象(如角色、敌人、道具等)进行统计时,可以使用访问者模式来实现,避免修改原有类定义
辅助管理类 当需要对各种对象(如角色、敌人、道具等)的“管理容器”类添加功能时,可以通过访问者模式减少对原有代码的更改

15. 迭代器模式(Iterator)

在不知道集合内部细节的情况下,提供一个按序方法存取一个对象集合体的每一个单元。(遍历)

使用场景 说明
遍历对象 循环语句(如 for 循环)就可以实现迭代器模式

16. 解释器模式(Interpreter)

定义一个程序设计语言所需要的语句,并提供解释来解析(执行)该语言。(翻译)

使用场景 说明
表达式计算 可以使用解释器模式来解析和计算游戏中的各种表达式

结构型 设计模式

17. 外观模式(Facade)

在游戏开发中,外观模式常被用于简化复杂系统的交互。通过为多个子系统提供一个统一的接口,将复杂的内部逻辑抽象为简单的调用。(高级封装)

使用场景 说明
音频管理器 创建一个音频管理器类,可以简化音频播放、暂停、停止等操作的调用。只需通过音频管理器接口来控制音频播放,无需关注音频资源的加载和播放器的创建
UI管理器 将UI系统中的交互逻辑,如按钮点击事件、文本显示等操作,封装在一个UI管理器类中,简化UI组件的访问和修改,同时降低UI系统与其他系统之间的耦合度
数据持久化 创建一个保存管理器类,可以简化保存和加载过程,同时方便后期扩展更多的存储功能

18. 桥接模式(Bridge)

桥接模式用于将抽象与实现分离,使它们可以独立地变化。使抽象类作为不同实现类间的桥梁。

使用场景 说明
角色与装备 可以将角色、装备的抽象与具体实现分离,使不同种类的角色可以搭配和使用不同种类的装备
输入系统 可以将输入设备(如键盘、鼠标、游戏手柄等)的抽象与具体实现分离,从而简化输入设备的管理和扩展,同时保持游戏逻辑的独立性
游戏资源管理 游戏资源(如纹理、模型、声音等)可能需要支持多种格式和来源(如本地文件、网络下载、内存中的数据等)。可以将资源的抽象与具体实现分离
网络系统 可以将网络协议(如TCP、UDP、Websockets等)的抽象与具体实现分离,从而简化网络协议的管理和扩展

19. 享元模式(Flyweight)

享元模式的主要目标是通过共享相同的对象,来减少内存占用和提高性能。

使用场景 说明
游戏对象属性共享 将游戏中大量具有相同属性的游戏物体中的相同部分提取出来,进行统一管理

20. 组合模式(Composite)

组合模式将对象组合成树形结构以表示层次结构。组合模式使得客户端可以以一致的方式处理单个对象和对象组合。

使用场景 说明
UI层次结构 通过使用组合模式,可以轻松地组织和管理树型UI菜单,实现事件传递和布局调整等功能
游戏任务逻辑 可以将任务、子任务和条件等逻辑元素组织成树形结构,实现逻辑的判断和执行等功能

21. 装饰模式(Decorator)

装饰模式允许在不改变原始对象结构的情况下,动态地向对象添加新功能,从而实现功能的组合和扩展。

使用场景 说明
角色属性修改 可以通过装饰模式增加角色的属性(如生命值、攻击力、防御力等)
游戏界面扩展 可以游戏界面添加额外的功能(如特效、动画、音效等),这样实现起来比较灵活,修改也方便
数据加密解密 -

装饰模式已有目标增加功能非常方便,但是要避免盲目使用导致系统过于混乱,应将可能需要的功能列在早期的开发计划中。


22. 适配器模式(Adapter)

适配器模式将一个类的接口转换成另一个类所期望的接口,使得原本接口不兼容的类可以一起工作,提高组件的复用性和扩展性。(转接口)

使用场景 说明
第三方库集成 当需要集成不同的第三方库(如广告、支付、社交等)时,可以使用适配器模式统一接口,方便切换和扩展不同的第三方库
输入设备兼容 可以统一不同输入设备(如键盘、鼠标、手柄等)的接口,实现多种输入设备的兼容和扩展
游戏引擎升级 当游戏引擎升级后,一些接口可能发生变化,使用适配器模式可以降低升级带来的影响
网络通信协议适配 在多人在线游戏中,可能需要支持多种网络通信协议(如TCP、UDP、WebSocket等),可以使用适配器模式统一接口,方便扩展和切换不同的通信协议

23. 代理模式(Proxy)

代理模式为其他对象提供一种代理以控制对这个对象的访问。代理模式可以用于延迟加载、安全控制、日志记录等功能。

使用场景 说明
优化测试 可以使用代理模式测试游戏优化的效果,以免去修改原始类的接口及实现
网络代理 在多人在线游戏中,可以使用代理模式处理与服务器的通信,方便进行数据加密、压缩、缓存等操作

在学习设计模式的过程中,我发现设计模式其实是面向对象的数据结构。
一个由0和1组成的系统,通过各种各样的数据结构和算法,层层编织出能够模拟现实的游戏世界,这实在是太美妙了!

Supongo que te gusta

Origin blog.csdn.net/Dugege007/article/details/130331557
Recomendado
Clasificación