电子书更新:更多设计模式和 SOLID 原则

早在 2022 年秋天,我们就推出了电子书籍 用游戏编程模式提升代码水平以及包含示例代码的 GitHub 代码库。我们还发布了由五部分组成的视频教程系列,以配合电子书和示例项目。
我们收到了大家对这些资源的良好反馈,其中许多人要求我们介绍更多的设计模式。感谢您的反馈意见。我和我的团队密切关注您的意见,我们非常感激。
今天,我很高兴地宣布,《用设计模式和 SOLID 提升代码水平》电子书的更新版已经面世,其中包含更新版的设计模式示例项目,您可以从 Unity Asset Store 下载。
电子书和示例项目现在都基于 Unity 6,并包含更多示例和模式。该示例项目还包含 UI 工具包的更多功能,包括一个演示数据库绑定的示例,这也是社区的一个热门要求。
请注意:Unity 6 将于今年晚些时候推出。如果您想跟进指南中的示例以及随附的演示项目,请务必下载Unity 6 预览版。

在深入了解电子书中的新内容之前,一些不太熟悉这些概念的人可能会有疑问:为什么要学习设计模式,它们如何融入 Unity 游戏开发?
回到你的反馈,虽然很多人都熟悉面向对象编程的基本原理,但在自己的代码中应用这些原理有时会感觉抽象和过于学术化。
这样想吧:您所面临的每一个软件设计问题,都有无数开发人员在您之前遇到过类似的挑战。虽然不能总是直接向他们请教,但可以通过设计模式学习他们的解决方案。
设计模式为软件工程中的常见问题提供了通用解决方案。它们不是现成的模板,可以复制粘贴到代码中,而是工具箱中的工具,需要时可以利用。有些模式比其他模式更直观,但每种模式在不同情况下都会有用。
我们为那些刚接触设计模式或需要复习的人编写了这本指南。它概述了游戏开发中可以应用这些模式的常见场景。如果您正从 Java 或 C++ 等其他面向对象的语言过渡到 C#,您会发现如何专门针对 Unity 调整这些模式的实用示例。
就其核心而言,设计模式只是一种理念。它们并不适用于所有情况,但只要使用得当,就能帮助你构建可扩展的应用程序。将它们集成到项目中将提高代码的可读性和可维护性。随着对这些模式越来越熟悉,您将发现简化开发流程的机会。
总之,我们的指南旨在提升您的编码技能,创建更好的 Unity Industry 项目,并建立对一般行业最佳实践的理解,让您在整个职业生涯中都能随身携带。

让我们来看看设计模式资源中新增的主要内容:
关于如何实施 SOLID 原则的扩展章节
现在,SOLID 的五项核心原则都在电子书中解释的示例项目中实施了可操作的代码示例。作为提醒,SOLID 是软件设计五个核心基本原则的缩写--将其视为需要牢记的五条基本规则,可以帮助你保持面向对象设计的可理解性、灵活性和可维护性。
简单提醒一下,SOLID 代表:
- 单一责任原则:一个班级应该只有一个改变的理由,也就是说,它应该只有一项工作或责任。
- 开放-封闭原则:类应该是开放的,可以扩展,但不允许修改,允许在不修改现有代码的情况下进行扩展。
- 利斯科夫置换原理超类对象应能被子类对象替换,而不影响程序的正确性。
- 界面隔离原则:客户不应被迫依赖他们不使用的接口。它提倡创建特定的接口,而不是单一的通用接口。
- 依赖倒置原则高层模块不应依赖低层模块,但两者都应依赖抽象模块。

从这些示例中可以得到的重要启示是,遵循这些原则可以帮助你在游戏开发中获得以下好处:
- 可读性:代码条理清晰,便于高效理解项目功能。遵守 SOLID 原则可以提高代码的可读性;当你的代码标准保持一致时,你就能提高团队中游戏程序员之间顺利协作的机会。
- 可扩展性:实施 SOLID 原则可促进代码的可维护性,这对于希望扩展的项目至关重要。通过遵守这些原则,在代码库的某一部分所做的更改就不太可能在其他地方引入意想不到的问题。这种方法可确保代码保持灵活性,适应不断变化的要求。
- 速度最终,SOLID 原则有助于改进游戏开发工作流程。模块化代码是 SOLID 所强调的一个关键方面,它将系统分解为更小、更易于管理的组件。这种模块化方法便于测试、调试和跨项目代码重用,缩短了开发时间,提高了生产率。

更新后的电子书和项目包括四个新图案,使总数达到 11 个。下面简要介绍一下每一项:
- 工厂模式:一个典型的用例是,当你有一些动力装备(如速度提升、护盾或额外生命)时,这些装备具有相同的属性,但功能却各不相同。在这里,可以使用工厂模式来创建从通用接口或基类派生出来的这些不同增强功能类的实例,从而在不修改现有客户端代码的情况下灵活添加新的增强功能。
- 对象池:有些人认为这是一种性能优化技术,而不是设计模式。无论如何,可以将其视为一种提高性能的方法,即重复使用对象,而不是频繁地创建和销毁对象。在我们的示例场景中,您将看到一个炮塔以极快的速度发射大量子弹的例子。我们不需要每次都对它们进行实例化(并在它们达到目的后进行清理,这样做会付出很大的性能代价),而是使用这种模式反复循环使用它们。
- 辛格尔顿单例可能是游戏开发中常见的模式之一,您现在很可能已经在使用它了。如果需要用一个对象来协调整个场景中的动作,它就非常有用。例如,您可能希望在场景中使用一个游戏管理器来指导主游戏循环。不过,在使用单例模式时也有一些陷阱需要注意,我们将在本指南中加以说明。
- 命令模式:如果你玩过使用撤消/重做功能或在列表中保存输入历史记录的游戏,你很可能见过该命令模式。例如,在策略游戏中,用户可以先计划几个回合,然后再按照输入的顺序执行。
- 国家模式:这允许对象在内部状态发生变化时改变其行为,从而简化了游戏角色或用户界面元素中复杂的状态依赖行为的管理。试想一个敌人 NPC 会有 "闲置"、"巡逻 "或 "攻击 "等不同行为,这取决于不同的游戏场景,如玩家在地图上的位置。
- 观察员模式:这种模式可以帮助你实现一个高效的事件系统,在这个系统中,对象可以动态地订阅事件并对事件做出反应。其中一个用例是,玩家在动作游戏中 Collections 会触发不同的事件,如播放声音、更新用户界面和播放动画。
- 模型视图演示器(MVP):这种模式的核心是将状态显示与实际状态解耦,从而实现一种反应式设计,即视图会根据模型的变化自动更新,这使它成为用户界面编程中的一种常见模式。模型是数据,视图是用户界面,而演示器则是处理视图逻辑和同步模型数据的 Mediation。
- 模型-视图-视图模型(新):顾名思义,这种模式与 MVP 模式有关,但通过添加运行时数据绑定功能对其进行了扩展,从而简化了用户界面元素的更新方式。在我们的示例中,我们利用了 UI 工具包和 Unity 6 预览版中的新数据绑定功能。
- 战略模式(新):这种模式定义了一系列算法,对每种算法进行封装,使它们可以互换,从而使算法可以根据使用它的客户端的不同而独立变化。例如,这种模式对于在游戏人工智能中实现不同的移动行为非常有用。
- 蝇量级图案(新):使用这种模式可通过尽可能多地与类似对象共享数据来优化内存使用。其基本思想是将共享数据集中到对象中。
- 肮脏的旗帜(新):当对象发生变化时,这种模式会将其标记为 "脏",因此只有在必要时才会对其进行重新计算或更新,从而有助于优化性能。这种模式可以帮助您在游戏循环或某些用户界面渲染情况下管理代价高昂的更新。

示例项目反映了电子书的内容,演示了 11 种模式中的每一种模式。您可以从资产商店下载该项目,并跟随相应的场景,了解这些模式在实际场景中的应用。请注意,该项目需要 Unity 6 预览版或更高版本。
在您开始项目之前,有几个有用的提示需要牢记。

从 Bootstrap 场景开始。该场景配置演示程序并提供主菜单访问权限(您可以在电子书中了解有关 SceneBootStrapper 概念的更多信息)。您可以从主菜单导航到相应的样本。每个场景都展示了不同的 SOLID 原理或设计模式。

请注意,示例项目与指南中的代码示例可能存在细微差别。为了提高清晰度和可读性,一些示例采用了简化代码,如公共字段。
您的团队可能喜欢与本指南或示例项目中使用的约定不同的编码风格。我们建议根据您的具体需求量身定制 C# 风格指南,并在整个团队中统一遵循。查看我们的电子书,了解如何创建自己的风格指南。
考虑所提供的示例,确定哪种设计模式最符合您的项目需求。当你熟悉了这些模式后,你就会发现它们在简化和改进开发工作流程方面的潜力。
有关使用设计模式的电子书和示例项目均可免费下载:
快乐编码