[Notes Unity] Application des modèles de conception dans le développement de jeux

Application des modèles de conception dans le développement de jeux

Récemment, en étudiant l'application des modèles de conception dans le développement de jeux , j'ai découvert qu'ils pouvaient en effet améliorer l'efficacité du développement, en particulier lors de l'ajustement et de la maintenance ultérieurs du code.
J'ai donc écrit cet article et enregistré brièvement mon expérience d'apprentissage, afin que je puisse être inspiré lorsque je le réviserai à l'avenir.

Avis

  • Cet article résume uniquement les scénarios d'application possibles des modèles de conception dans le développement de jeux basés sur des livres et du matériel Internet, et n'explique pas les principes des modèles de conception.
  • Dans les applications pratiques, il existe généralement des cas où plusieurs modèles de conception sont utilisés en combinaison. Cet article est classé par modèles de conception, et il y aura des situations où le même scénario d'utilisation apparaîtra dans plusieurs modèles de conception.
  • Dans le développement réel, certaines fonctions peuvent avoir d'autres méthodes d'implémentation, ou certains modèles de conception peuvent avoir d'autres scénarios d'application. La liste de cet article peut être erronée ou pas assez complète. Vos corrections et ajouts sont les bienvenus.

Modèles de conception de création

1. Célibataire

Le modèle singleton est largement utilisé dans le développement de jeux. Le modèle singleton garantit qu'il n'y a qu'une seule instance d'une classe et fournit un point d'accès global pour obtenir cette instance.

scènes à utiliser illustrer
gestionnaire de jeu Responsable du traitement de la logique de base du jeu, telle que l'état du jeu, la progression du niveau, etc., peut être utilisé en combinaison avec le mode d'apparence
gestionnaire audio Idem pour l'effet
Gestionnaire d'interface utilisateur idem
Divers gestionnaires de modules idem
persistance des données idem
Client de jeu en ligne Utilisez le mode singleton pour limiter le nombre de connexions, empêcher les abus de générer trop de connexions et éviter les pannes côté serveur
outil de journalisation -

Bien que le mode singleton soit pratique, il doit être utilisé le moins possible :
"Le mode singleton viole également le principe d'ouverture et de fermeture, car l'objet obtenu via la méthode Instance est la classe d'implémentation plutôt que la classe d'interface. Par conséquent, lorsque la conception change ou les exigences augmentent, le concepteur du programme Il ne peut pas être remplacé par d'autres classes, mais seul le code du programme dans la classe d'implémentation d'origine peut être modifié, de sorte que l'exigence de fermer la modification ne peut pas être satisfaite." —— "Modèles de
conception et développement de jeu parfait"

Le modèle singleton peut être utilisé pour modulariser le code. L'utilisation directe du modèle singleton (Singleton) peut entraîner une confusion dans le code et des difficultés de maintenance car il n'y a pas de restriction d'accès.
Un modèle singleton complet devrait augmenter les restrictions d'accès. Par exemple, le conteneur IOC (Inversion of Control) est introduit pour obtenir l'effet d'un mode singleton avec des restrictions d'accès en interrogeant le dictionnaire.
Si vous comparez le cadre de code du jeu à l'installation, et l'instance unique aux lignes de connexion de plusieurs modules importants, alors introduire un conteneur IOC équivaut à ajouter un "gestionnaire de câbles" (de nombreux autres modèles de conception ont également cette fonction) .
L'utilisation du conteneur IOC permet d'écrire facilement du code conforme aux principes d'inversion de dépendance (D) et de responsabilité unique (S).


2. Modèle de méthode d'usine (méthode d'usine)

Le modèle de méthode de fabrique permet de séparer la création et l'utilisation d'objets. En définissant une interface de fabrique, les sous-classes peuvent décider quels objets spécifiques produire.

scènes à utiliser illustrer
génération de personnage En utilisant le modèle de méthode d'usine, vous pouvez définir une interface d'usine de rôles, puis implémenter des classes d'usine spécifiques pour chaque type de rôle (comme les joueurs, les ennemis, les PNJ, etc.), qui peuvent être utilisées avec le modèle de constructeur.
génération d'outils Vous pouvez définir une interface d'usine d'accessoires, puis implémenter des classes d'usine spécifiques pour chaque type d'accessoire (tels que des armes, des armures, des consommables, etc.)

3. Modèle d'usine abstraite (usine abstraite)

Le modèle Abstract Factory fournit une interface pour créer une série d'objets liés ou dépendants sans spécifier leurs classes concrètes. Le système peut décider quel groupe de sous-classes produire en fonction de l'environnement d'exécution actuel.

scènes à utiliser illustrer
chargement des ressources En utilisant le modèle de fabrique abstraite, vous pouvez créer des classes de fabrique correspondantes pour différents types de ressources, afin d'obtenir une interface de chargement de ressources unifiée.
Création d'interface utilisateur Différentes classes de fabrique d'interface peuvent être fournies pour aider à réaliser la réutilisation et la personnalisation des composants de l'interface utilisateur
génération de niveau Vous pouvez créer une classe d'usine pour différents types de niveau (tels que forêt, désert, ville, etc.), qui contient différents contenus et éléments générés, et vous pouvez utiliser le modèle d'usine abstrait lors de l'ajout de nouveaux types de niveau
génération d'outils Idem pour l'effet

Modèle d'usine abstrait et modèle de méthode d'usine

Modèle abstrait d'usine :

  • Classe d'usine abstraite - * Interface d'usine - * Classe d'implémentation d'usine - * Produire des produits
  • Facile à étendre, pas facile à modifier

Modèle de méthode d'usine :

  • Interface d'usine - Classes d'implémentation d'usine - * Produire des produits
  • Il est facile d'avoir trop de nouveaux produits et de faire exploser l'usine

(* indique qu'il peut y en avoir plusieurs)


4. Mode constructeur (Constructeur)

Le modèle de générateur sépare le processus de construction d'un objet complexe de sa représentation, de sorte que le même processus de construction peut créer différentes représentations d'objet. (montage étape par étape)

scènes à utiliser illustrer
génération de personnage Les personnages peuvent être créés par étapes et fournir différentes combinaisons (telles que des attributs, des compétences, des effets spéciaux, des comportements d'IA, etc.), ce qui permet une création de personnage flexible
génération de niveau Le processus de création de carte peut être décomposé en étapes, chaque étape est responsable du traitement d'un élément de carte spécifique (tel que le terrain, les bâtiments, les accessoires, etc.)
génération d'outils Les accessoires et l'équipement peuvent être créés par étapes (comme la puissance d'attaque, la puissance de défense, la durabilité, etc.), offrant des combinaisons flexibles

5. Prototype

Le modèle Prototype crée de nouveaux objets en copiant des objets existants (prototypes), plutôt qu'en utilisant des méthodes de construction traditionnelles.

scènes à utiliser illustrer
Chargement des ressources du jeu GameObject.Instance dans Unity est un modèle prototype

Modèles de conception comportementaux

6. Mode d'état (état)

Le modèle State permet à un objet de modifier son comportement lorsque son état interne change.

scènes à utiliser illustrer
gestion de l'état des rôles Gérer le statut du rôle. Pour les états tels que debout, courir, sauter, patrouiller, attaquer, etc., en utilisant le modèle d'état, la logique et le comportement de chaque état sont encapsulés dans une classe distincte, ce qui rend la logique de commutation entre les états de caractère plus claire.
Changement de niveau de jeu ou de scène Gérer la commutation de niveau et de scène, le comportement logique
Menu du jeu et gestion de l'état de l'interface utilisateur Tels que le menu principal, l'interface de réglage, le menu de pause, etc. Le mode d'état peut simplifier la logique de commutation entre ces interfaces, rendant le système d'interface utilisateur plus modulaire et facile à entretenir

Mode d'état et machine à états finis (Finite State Machine, FSM)

Le modèle d'état peut être vu comme une implémentation orientée objet d'une machine à états finis. Les transitions d'état et le comportement d'état dans une machine à états finis peuvent être représentés plus clairement en utilisant le modèle d'état.
Dans le développement de jeux, le modèle d'état peut être utilisé pour implémenter des machines à états finis pour gérer les transitions d'état et le comportement des objets.


7. Mode médiateur (Médiateur)

Le mode intermédiaire est utilisé pour réduire le couplage entre plusieurs objets et concentrer l'interaction entre les objets dans un "objet intermédiaire" pour le traitement. (hub d'interaction entre plusieurs sous-systèmes)

scènes à utiliser illustrer
Interaction entre les sous-systèmes Peut être utilisé comme hub d'interaction entre les sous-systèmes du jeu
système d'interface utilisateur Le mode intermédiaire peut être utilisé pour extraire la relation d'interaction complexe de l'interface utilisateur de chaque élément de l'interface utilisateur et la concentrer dans un objet intermédiaire pour le traitement.
interaction entre les personnages La logique d'interaction telle que les dialogues et les transactions entre les rôles peut être séparée des objets de rôle, et des objets intermédiaires peuvent être introduits pour le traitement
système d'événements Concentrez la logique de traitement des événements tels que les joueurs vaincus et les éléments collectés dans un objet intermédiaire pour simplifier le processus de publication et d'abonnement aux événements (le mode observateur est recommandé)

8. Stratégie

Le pattern Strategy permet de changer dynamiquement le comportement d'un objet à l'exécution. En utilisant le modèle Strategy, vous pouvez encapsuler un ensemble d'algorithmes interchangeables dans un ensemble de classes indépendantes, ce qui simplifie votre code et améliore la maintenabilité et l'extensibilité.

scènes à utiliser illustrer
Calcul des attributs de caractère Vous pouvez utiliser le modèle de stratégie pour séparer différents attributs et méthodes de calcul pour une modification et une utilisation faciles
génération de niveau Différents algorithmes de génération de niveau peuvent être encapsulés dans un ensemble de classes indépendantes, et la stratégie de génération de niveau peut être commutée dynamiquement selon les besoins au moment de l'exécution
Ajustement de la difficulté du jeu idem

Modèle de stratégie vs modèle d'état

"L'état consiste à basculer entre un groupe d'états, et il existe une relation correspondante et connectée entre les états; la stratégie est composée d'un groupe de classes qui n'ont aucune relation et ne connaissent pas l'existence les unes des autres. L'état est limité par le règles de commutation de la machine d'état, dans la
conception Tous les états possibles seront définis au début, même s'ils sont ajoutés plus tard, ils doivent être liés aux états existants, au lieu de les ajouter dès qu'ils le souhaitent ; La stratégie est un modèle de conception formé en encapsulant des algorithmes informatiques, et il n'y a aucune relation entre les algorithmes. Dépendance, de nouveaux algorithmes peuvent être ajoutés ou remplacés immédiatement." ——
"Design Patterns and Perfect Game Development"


9. Méthode du modèle

Le modèle de méthode de modèle définit le squelette d'un algorithme dans une méthode et résume certaines étapes répétitives des sous-classes aux super-classes. De cette façon, les méthodes de modèle permettent aux sous-classes de redéfinir certaines étapes d'un algorithme sans changer la structure de l'algorithme. (Processus général)

scènes à utiliser illustrer
Chargement de niveau La structure de base du chargement de niveau (telle que le préchargement des ressources, l'initialisation des scènes, le chargement des caractères, etc.) peut être définie dans une classe de base abstraite, et les étapes de chargement spécifiques peuvent être reportées aux sous-classes
système de réussite Vous pouvez utiliser le modèle de méthode de modèle pour définir une classe de réussite abstraite, qui contient des méthodes squelettes de vérification de réussite de base et implémente une logique de vérification de réussite spécifique dans les sous-classes.
Connexion au jeu en ligne Le processus de connexion est fixé via le mode de méthode de modèle, tel que l'affichage de l'écran de connexion, la sélection de la méthode de connexion, la saisie du mot de passe du compte, l'envoi d'une demande au serveur, etc., afin que la sous-classe de fonction de connexion puisse réaliser des opérations spécifiques.

10. Mode de commande (commande)

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

使用场景 说明
交互逻辑 在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组成的系统,通过各种各样的数据结构和算法,层层编织出能够模拟现实的游戏世界,这实在是太美妙了!

Je suppose que tu aimes

Origine blog.csdn.net/Dugege007/article/details/130331557
conseillé
Classement