很自然地就想到了使用单例模式实现。而很多开源库里都会提供可复用的单例模板,一般叫 Singleton 和 MonoSingleton。所以单例的模板作为第一个工具被收录到框架中。
“代码是资产”思维在写一个项目的时候,不要短视的说我就把这个项目做完了,就是交一个差上线了就完了,我们希望每写一个游戏的时候,我们都积累一些东西,把写的每一行代码,都当成是一个可以收藏的,甚至是可以传递下去的这样的一个资产。有了这样一个思想,可能我们在写代码的时候,整个的思维模式会完全不一样。——刘钢《Unity 项目架构和开发管理》
听到上面这段话,在当时的笔者心中埋下了一颗种子。在这个基础上进行思考,会产生很多很有价值的想法。本小节先讲到这里。
小结文章读到这里我们简单进行总结一下。
架构是“约定、规则、共识”
框架具有约束性和支撑性
好的架构直接就等于一套好的规则,好的准则
Unity 好的规则
3.起文件夹的名字时尽量和 GameObject 对应起来
MVC 文件结构:先按照业务功能划分,再按照 MVC 来划分
“代码是资产”思维
QFramework
工具集
FSM
Singleton&MonoSingleton
MsgDispatcher
MathUtils
结合跑酷项目准备阶段,以上的结论应用的结果如下图所示:
图中的需求收集/业务分析是本小节没有讲的,由于这个跑酷项目是合作项目,有一些需求合作方本身也没太想清楚,在进行准备这个阶段之前,跑酷项目已经完成了一版 Demo 进行了需求上的确认。
由于受到“代码是资产”思维的影响,QFramework 的开发模式最初是以收集工具为目的的,此时的 QFramework 并不是真正意义上的框架,而是一个库或一个工具集。
跑酷项目开发在准备完毕之后,跑酷项目就开始了大量的业务/逻辑开发。
语言学习在做跑酷项目时,笔者当时的水平怎么样呢?三个字,非常菜。有很多很基本的功能要学习 Unity API 才能完成,比如跑酷的关卡生成器等等。对 C# 语言的掌握也是靠着以前一点 Java 经验,才能勉强能应付逻辑开发,之前所说的单例的模板,也只是知道怎么去用,并不知道实现的原理。这时候笔者觉得必须要对 C# 进行基础学习。于是就开始每天看一点传智的 C# 基础视频。学习的过程中,一些语言特性不知道怎么用,而有的语言特性觉得很有用。所以此时只是为了完成项目而进行学习,自然而然地就没有太多的精力去深究语法细节。我们大家都知道,这不是一个很好的学习方式。
QFramework 是知识积累工具随着对 C# 语言的了解程度加深,慢慢地可以看懂一些工具的源码了,也可以自己实现一些很简单的封装。而笔者在跑酷项目的开发期间先后收录了有限状态机、消息分发器和一些数学工具。以上收集的工具与单例的模板一样,都是同一性质的工具,所以这里没什么好说的。值得一提的是笔者当时做了一件事,笔者按照之前 cocos2dx 的使用习惯把一些 Unity 的 API 简单封装了一下,最初这么做只是为了提高自己的开发效率,扩大自己在 Unity 里的舒适区(笔者之二前一种用 cocos2d)。做了这件事之后给了笔者很大启发,笔者为什么不把一些新学习的 Unity 的 API 或者 C# 特性简单封装一下然后收录到 QFramework 中呢?这样以后使用这些 API 的时候就不用再查询搜索引擎了,直接使用封装的工具就好了。这样还能让 QFramework 帮助笔者“记住” Unity 的 API 和 C# 的特性。从那以后 QFramework 不止是一个工具集,也是笔者的一个知识积累工具。这样耗能解决上文中笔者对“学习的知识没有用武之地”的困扰。这样既能激发笔者的学习动力,又对 QFramework 本身也有好处,一石二鸟。
业务支撑工具我们都知道,做一个游戏项目,都会用到 UI、音效、配置表和数据存储等模块。跑酷项目也是一样的,在刘钢老师的《Unity 架构设计与开发管理》视频里提出了一个叫做 Manager Of Managers 的架构方案,可以把以上模块全部做成一个单例,比如 UIManager,AudioManager 等。而笔者认为,这些工具模块都是为了支撑游戏业务的,比如游戏音频管理方案,界面层级管理方案等等。也就是说大多数项目都用得到。而不像单例的模板、有限状态这些工具,它们不是为了支撑业务而积累的。为什么这么说呢?单例的模板是设计工具,解决的问题不是业务问题是设计问题,而有限状态机则是一种数据结构,是简化一部分问题的思维模型。而 UIManager、AudioManager 等等。每个模块都是独立的解决方案,是为了解决某一业务问题而设计的。所以笔者在这里称它们为业务支撑工具。
而刘钢老师的在视频中列出了以下模块:
MainManager
EventManager
AudioManager
GUIManager
PoolManager
LevelManager
GameManager
SaveManager
MenuManager
这里除了 GameManager 以外,其他的全部可以在别的项目中复用。
这时跑酷项目中已经实现了
SoundManager(AudioManager)
ConfigManager(LevelManager)