我们花了 5 篇文章学习了消息机制的方方面面。并且完成了一个简易消息机制,之后集成到了我们的 MonoBehaviourSimplify 里。

现在 MonoBehaviourSimplify 有一点框架的感觉了。因为 MonoBehaviourSimplify 在提供消息功能的同时,决定了项目脚本中的交互方式。而目前的这套结构,足够用它来完成一个比较小的项目了。

消息机制是笔者在接触单例之后,第二次被震撼到的设计模式(观察者模式/发布者订阅者模式)。而笔者在初学的时候,还不太敢去设计 MonoBehaviourSimplify 这样的基类,因为当时总觉得自己对 MonoBehaviour 生命周期理解得不够透彻。但是,笔者在使用消息机制的时候遇到了很多问题,比如之前提到的,总是忘记注销消息,从而导致游戏闪退等各种奇怪的 bug,随着 bug 遇到得多了,就越来越意识到自动注销消息的重要性,而自动注销消息最好的方式就是通过继承基类的方式。所以就冒着风险被迫着就去写了这么一个类,这个类以前的名字叫做 QNode 也就是我们今天 MonoBehaviourSimplify 的前身,直到现在为止,QFramework 的核心还是通过 QNode 演变过来的类,现在叫做 QMonoBehaviour。

而在当时通过设计这么一个基类之后,笔者就对设计父类这种形式有了很大的信心,所以就只要能加到 MonoBehaviourSipmlify 的东西就全部加进去了,一直这样下去,理论上这样也不会发生问题,但是后来又找到了更好的方式,学习了更好的方式之后呢,就可以分辨出来哪个适合继承,哪个适合用方法独立实现,而哪个适合做成更复杂的系统。不过目前的这套结构,如果各位学到这里也没有太大的问题,已经可以拿去做项目了。

但是如果想做出更好的库和框架,那就最好认真看完这个专栏的文章。因为这是笔者三年框架思考的浓缩版。

而到目前为止,我们可以画出来一个框架的结构图了。

如下所示:

虽然东西不多,但是至少目前的我们的库可以叫做框架了。

到这里呢,我们还没有去讲框架、架构、库这些东西,现在正是讲这些概念的最好时机,所以从下一篇开始,我们会慢慢接触这些概念。

在上一篇呢,我们的得到了目前库的一个分层图,如下:

而这个图中,把我们的库分成两个部分。一部分是框架,一部分是工具/库。

框架部分,只有一个 MonoBehaviourSimplify,而工具/库,则是除了 MonoBehaviourSimplify 以外的全部内容。

为什么 MonoBehaviourSimplify 是框架呢?

我们先来看看框架是什么?

框架:提供一个架构(文件结构、约定等等),你必须遵守它,只要你遵守,那剩下的就全部处理通用需求了。

这个定义呢是来自某个 JavaScript 大神书里写的。笔者非常认可这个说法。

那么 MonoBehaviourSimplify 为我们提供了怎样的架构?

只要我们的每个脚本都继承了 MonoBehaviourSimplify 就可以使用它的消息功能,并且它的消息功能非常方便,这个是利好的方面,我们想和某个脚本交互,不需要获得这个脚本的对象,而是两个脚本只要约定好注册的消息名就好了。

所以它的推荐使用方式是,继承。

其次,继承了之后,编译器会给你报错,因为要强制实现 OnBeforeDestroy 这个方法。那么这个就是多用户的约束,这部分其实是属于我们的约定部分。

框架和用户约定好了,如果想更爽地使用 消息功能以及简化的 API,那么用户只能遵循它的用法,继承它,并重写 OnBeforeDestroy 方法。

那么说到这里,还没有提到架构两个字。

架构在哪里?

我们仔细回忆最初 MonoBehaviourSimplify 解决的是什么问题?

是解决脚本之间访问问题。

在使用 MonoBehaviourSimplify 之前,脚本之间交互的模拟图如下:

图中箭头的意思呢,是拥有脚本引用的意思,可以理解成成员变量,说耦合性非常高。

而使用了 我们的 MonoBehaviourSimplify 之后,脚本之间的交互模拟图就会变成如下:



虽然我们的脚本还是与 MsgDispatcher 耦合了,不过情况好了很多,脚本之间就没有耦合了。

由于继承了 MonoBehaviourSimplify,在使用消息功能的时候压根感受不到 MsgDispatcher 存在。

而这就是 MonoBehaviourSimplify 提供的架构。

它提供了:

  • 约定:

    • 用户与框架之间的约定,用户想使用框架功能,就要遵循框架的使用规则。
  • 规则:
    • MonoBehaviourSimplify 的规则,就是要继承 MonoBehaviourSimplify,要覆写 OnBeforeDestroy。
  • 共识:
    • 用户与框架作者,都更推荐使用消息来处理脚本之间访问的问题。

而我们的 MonoBehaviourSimplify 除了提供了约定、规则、共识之外,还影响了脚本之间的交互结构。上边的两张图就是证明。

而在之前里说约定、规则、共识有什么用呢?

在这里笔者告诉大家。

架构的本质,就是约定、规则、共识。通过约定、规则、共识从而影响项目中任何东西的结构。比如项目目录规范(规则)导致了项目文件结构(编码规范)导致了代码结构,而主程与开发者的约定就会导致项目的模块结构以及团队结构等。总之,架构最终的目的,就是得到一个好的结构。好的目录结构,好的代码结构,好的程序结构,以及好的脚本之间交互所产生的结构,那么什么才算好呢?俗话说,就是弟兄们干活干得快干得好,项目跑得快跑得好,这就是好的架构。

扯得有点远了,总之,框架提供了架构,更准确地说,是一部分架构,而我们的 MonoBehaviourSimplify ,改善了脚本之间交互的问题,针对这个问题,提供了一个脚本之间的交互结构,也就是下图所示的结构。

这就是我们库当中,属于框架的部分。

OK,我们最后再回顾一下,什么是框架:

框架:提供一个架构(文件结构、约定等等),你必须遵守它,只要你遵守,那剩下的就全部处理通用需求了。

从这一点去考虑,我们的 MonoBehaviourSimplify 是不是框架呢?

转载请注明地址:凉鞋的笔记:liangxiegame.com

更多内容

Unity 游戏框架搭建 2019 (五十、五十一) 消息机制小结&MonoBehaviourSimplify 是框架?的更多相关文章

  1. Unity 游戏框架搭建 2019 (四十六) 简易消息机制 & 集成到 MonoBehaviourSimplify 里

    在上一篇,我们接触了单例,使用单例解决了我们脚本之间访问的问题. 脚本之间访问其实有更好的方式. 我们先分下脚本访问脚本的几种形式. 第一种,A GameObject 是 B GameObject 的 ...

  2. Unity 游戏框架搭建 2019 (二十五) 类的第一个作用 与 Obselete 属性

    在上一篇我们整理到了第七个示例,我们今天再接着往下整理.我们来看第八个示例: #if UNITY_EDITOR using UnityEditor; #endif using UnityEngine; ...

  3. Unity 游戏框架搭建 2019 (十三~十五) 接下来要学什么?& 第九个示例

    在之前的两篇中,我们使用 public 静态方法对之前的内容进行了一个抽取,有了 public 静态方法这个工具,我们的学习行为也发生了一点变化. 在没使用 public 关键字之前呢,每一个示例仅仅 ...

  4. # Unity 游戏框架搭建 2019 (三十四、三十五) 9 ~ 10 示例整理

    第九个示例 目前代码如下: using UnityEngine; #if UNITY_EDITOR using UnityEditor; #endif namespace QFramework { p ...

  5. Unity 游戏框架搭建 2019 (四十四、四十五) 关于知识库的小结&独立的方法和独立的类

    在上一篇,我们完成了一个定时功能,并且接触了 Action 和委托.lambda 表达式这些概念. 到目前为止,我们的库作为知识收录这个功能来说,已经非常好用了,由于使用了 partial 关键字,所 ...

  6. Unity 游戏框架搭建 2019 (九~十二) 第一章小结&第二章简介&第八个示例

    第一章小结 为了强化教程的重点,会在合适的时候进行总结与快速复习. 第二章 简介 在第一章我们做了知识库的准备,从而让我们更高效地收集示例. 在第二章,我们就用准备好的导出工具试着收集几个示例,这些示 ...

  7. Unity 游戏框架搭建 2019 (三十二、三十三) 类的命名 & 代码文件命名

    昨天我们完成了第八个示例的第二个 MenuItem 菜单顺序的调整. 我们今天再往下接着调整. 我们来看下接下来的 MenuItem 代码如下: [MenuItem("QFramework/ ...

  8. Unity 游戏框架搭建 2019 (三十六~三十八) partial与public

    在上一篇,我们把菜单的顺序从头到尾整理了一遍.在整理菜单顺序的过程中,记录了一个要做的事情. 要做的事情: (完成) 备份:导出文件,并取一个合理的名字. 整理完菜单顺序后,学习新的知识,解决随着示例 ...

  9. Unity 游戏框架搭建 2019 (四十二、四十三) MonoBehaviour 简化 & 定时功能

    MonoBehaviour 简化 在前两篇,我们完成了第九个示例.为了完善第九个示例,我们复习了类的继承,又学习了泛型和 params 关键字. 我们已经接触了类的继承了.接触继承之前,把类仅仅当做是 ...

随机推荐

  1. word 小技巧 方框中 打 对勾

    方框中  打 对勾 称为 复选框 控件,单击鼠标,在两种符号中切换. 设置步骤 1. 将隐藏的"开发工具"选项卡,显示出来 2. 在所需位置,插入复选框 3. 在属性中,设置复选框 ...

  2. python学习之变量以及变量/标识符/关键字

    Python成为一门易读.易维护,并且被大量用户所欢迎的.用途广泛的语言,代码简洁,功能强大,是使程序员能够专注于解决问题而不是研究语言本身.接下来我们先从它的语法开始学起 1.首先要懂得python ...

  3. Coursera课程笔记----Write Professional Emails in English----Week 3

    Introduction and Announcement Emails (Week 3) Overview of Introduction & Announcement Emails Bas ...

  4. 拒绝老土!暗黑风格半透平面化主题—InfinityFreedom正式发布

    经常听到“路由器界面土点就土点吧,凑合能用就成.” 诚然,路由器重要的是功能,但为什么要辣眼睛呢? 拯救喜欢折腾的你,抢救干涩的眼球,原创OpenWrt主题Infinity Freedom正式发布! ...

  5. Linux高性能服务器技术总结

    文章目录 1 服务器简介 2 I/O复用技术 2.1 循环方式 2.2 select 方式 2.3 poll方式 2.4 epoll 方式 3 多线程方式 4 CPU多核并行计算 5 深度分析内核性能 ...

  6. [hdu5445 Food Problem]多重背包

    题意:一堆食物,有价值.空间.数量三种属性,一些卡车,有空间,价格,数量三种属性.求最少的钱(不超过50000)买卡车装下价值大于等于给定价值的食物,食物可以拆开来放. 思路:这题的关键是给定的条件: ...

  7. [hdu4576]dp

    题意:1-n围成1圈,从1出发,第i次走a[i]步,问走m次后出现在[L,R]的概率L<=R. 思路:明显的DP,把编号变成0~n-1,令dp[i][j]表示走完i步之前停在了j上,则有dp[i ...

  8. ScrollView 内嵌百度地图问题解决

    在ScrollView上内嵌百度地图遇到两个问题 事件冲突,移动地图的时候屏幕滚动了 移动ScrollView的时候,百度地图出现黑边 问题1的处理就有各种办法了,核心都是拦截事件,我使用的办法是加一 ...

  9. JQuery踩过的坑,遇到就记下

    1 乱用选择器 坑人指数:200 JQuery选择器调用代价很大,反复调用效率更低.应采用缓存对象的方法或采用链式调用的方式. //错误的写法 $("#button").click ...

  10. post请求导出表单。

    postExcelFile(params, url) { //params是post请求需要的参数,url是请求url地址 var form = document.createElement(&quo ...