折腾框架几个月了,期间踩过很多坑
不过既然这些坑我踩过了,那么总得留下什么,随便分享点心得,顺便指个路吧
基于Manager的各种功能单例
首先学完唐老师的小框架,应该体会到了基于Manager的单例框架的用处了。
这个时候可以多去积累功能单例和熟练单例框架的用法。
怎么积累功能单例?
每次学到啥功能,就抽象出一个单例管理器进行总结就行了,
唐老师的教学方法也是这样,每次最后的练习都是一个基于XX功能的单例管理器。
例如 : 基于唐老师的序列化相关,自己写一个存档功能单例
基于唐老师的InputSystem,自己封装个通用的玩家输入单例
每一个单独的小的功能模块,都可以用一个功能单例封装学习。
自己封装一个单例,就是自己对那部分知识点的归纳总结。
B站有很多基于特定模块的视频教程,如果会科学上网且啃的动生肉,油管有更多的学习素材。
Unity上也有很多免费的游戏模板和功能插件可以借鉴学习。
这样的功能单例学习方法可以有效减低学习的难度,单元测试也容易,很容易获得反馈。
这段时间应该是进步最大的时间,每天都能感受到日有所进,能很快搭建出学习的正反馈循环
要记住这种感觉和时光, 这能有效消磨后期学习的迷茫。
尝试自己整一个小项目,应用实践小框架
各种功能模块单例积累多了就应该自己整个小项目了。
因为之前把各个模块都用单例封装隔离开了,每个单例单独维护一个小功能。
这个时候的与其说是写小项目,不如说是拼接积木,每个单例模块都是一块积木,
小的单例模块组成大的功能模块,大的功能模块组成游戏骨架,
别管那些所谓的单例过多的危害, 整个小demo,单例梭哈就完事了。
然后去Unity商店整点免费的模型和UI素材,填充内容。
很快一个小demo就能完成,或许看着很粪,素材廉价,功能简陋,手感也很怪
但是It works , 这就够了。
总结就是先不用总想着,这样编码是否合理,是不是写得很烂,抓紧出东西才有继续学下去的感觉。
对粗糙的项目进行清理
demo完成了,但是这只是demo,距离游戏完成也只是刚刚起步而已。
接下来应该做的是代码清理, 这是bonus time。
把之前积累的屎山代码清理干净是非常解压的一个过程:
功能类似的小单例合并成大单例。
把功能庞杂的模块单例,分解成数个职责清晰的小单例,然后又合并成职责清晰的大单例。
可以一边整理一边思考,这个功能一定要用单例不可嘛?
如何用其他结构来替换这个单例的职责?
开始框架进阶修炼
个人小项目完成了就可以进行框架进阶了,
一个框架需要有啥?无非是几个常用且通用的功能模块罢了。
UI模块,声音模块, 资源管理模块, 数据管理模块, 事件模块…
那么接下来的目标就是这些通用模块的深入探索了!
- UI模块,唐老师的MVC框架课程,学完PureMVC应该够用。
虽然PureMVC写游戏有些繁琐, 但是重点是里面的设计模式和解耦思想。
- 声音模块,如果不学习fmod wwise 这些声音中间件的话,小框架封装应该够用。
- 资源模块,下一步是用唐老师的Adressable课程替代唐老师小框架的Resouce资源管理。
框架进阶,先把唐老师课程中有的进阶功能先整上去再说。
总之,经过了唐老师小框架的学习和个人项目的实践,对于Manager类型的管理方式应该很熟练了。
好用的框架工具 UniFramework
接下来就应该是Manager Of Manager类型的学习了。
我这推荐一个框架 UniFramework,这是资源管理框架YooAssets的作者文西大佬的一个轻量级的框架。
这个框架写的非常精炼, 代码量很少,但是该有的功能都有。
接下来俺就对UniFramework进行简单的介绍
UniFramework采用的是模块化的架构,每个功能模块彼此独立。
内部功能模块都是通过对应Driver进行驱动的,简单介绍一下这些模块。
UniSingleton : 单例模块, 这个模块重点讲一下
UniSingleton提供了一个单例管理的功能,这个模块很有GF的味道(GF是啥之后再说)。
- 首先是ISingleton定义了创建单例 轮询单例 销毁单例的功能,Wrapper 持有ISingleton,
- 然后SingletonDriver的Mono在Update中驱动单例模块。
- 单例模块再在Update中驱动Wrapper持有的ISingleton接口。
也就是说单例模块一个Mono间接驱动了所有单例模块中管理的单例。
单例模块所管理的单例也可以是某个功能模块的管理类,这就是Manager Of Manager。
而UniFramework的其他模块的Driver其实也可以更改成单例,被单例模块所驱动。
作者是为了模块之间的独立性而刻意用Driver分隔的,就像是每个模块中的UniLogger一样,
最终形态应该是一个SingletonDriver驱动整个框架的所有模块,避免了额外的Mono消耗,结构上也更优美。
另外,单例模块还有一个共享Mono功能,这个唐老师小框架有就不多赘述。
UniAnimation : 这是基于Playable封装的动画模块,Playable偏底层,有空且有兴趣的可以去学习
小白的话不推荐,用Animator就行, Unity这块坑多的很
UniEvent : 一个非常精炼的事件系统,代码量不多,但是延时事件,一对多事件,事件缓存池…. 该有的都有
可以直接当做是唐老师小框架事件模块的升级版
UniMachine : 状态机模块, 提供状态机管理和数据黑板
UniNetwork : 网络模块,这个很适合配合唐老师的网络课程一起看, 会很有收获
比如 : 环形缓冲区和同步队列啥的
UniPooling : 对象池模块,不过和YooAssets高度集成,毕竟这是YooAsset作者的写的小框架
简单概况一下就是对象池模块为每个YooAssets的资源包配备了一个Spawner来创建和管理那个资源包的对象池
Spawner为包中的每个对象都创建一个对象池进行管理
也就是说 对象池管理对象, Spawner管理对象池, 对象池模块管理Spawner, Manager Of Manager
UniTween : 补间动画系统, 对Tween功能的实现感兴趣的可以去康康,小白直接用DoTween就好
UniUtility : 提供了实用的工具类,可以重点康康里面的UniTimer计时器工具
UniWindow : UI模块, 这个也和YooAssets集成, 毕竟UI预制体的加载需要依靠资源系统
不过这个UI模块也很值得一看, 基于栈的UI管理, UI特性标注…
是非常简单高效的一套UI模块了
怎么学习这个UniFramework呢?
毕竟这个框架可没有文档和视频教程,作者也说了这个框架只是他的经验总结。
这个时候就要用到之前写的个人项目了,用UniFramework把之前用唐老师小框架写的项目再写一遍,或者说移植一遍。
当然用这个框架新开一个项目也可以,不过用之前写的项目再写一遍更快,体会也更深一点。
就像是唐老师的UI四部曲一样,实践项目都是同一套案例,对比之下就更能体会不同UI框架的异同。
学习新的框架也是这样,把旧项目移植到新框架上,那么这个框架也能说是掌握个七七八八了。
接下来的进阶之路,偏重的一些的框架
这里我推荐的GameFramework框架。
UniFramework和GameFramework有很多相似的地方。
这里就不对GameFramework的模块进行介绍了, 模块太多了。
先从更轻量的UniFramework入手学习可以很快上手GameFramework。
GameFramework的是市面上比较成熟的商业框架了,
学习方法还是推荐用之前写过的个人项目再移植一遍。
对照着GameFramework的官方案例StarForce,移植进度应该会很快,
不过GameFramework是把一套框架划分成了GF层和UGF层,理解上可能会造成困难。
这个时候应该多用UML画图来理解, 再复杂的功能框架,顺着调用栈多扒拉几层也会渐渐变的清晰。
GF的文档资料也很多(官方的很少),多康康大佬的解析能省很多功夫。
而真正要体会GF的妙处还得多用这个框架,去体悟。
GF是个非常不错的学习案例,值得细细品读。
尝试学习相对简洁的服务器框架
学完GF那么客户端基础框架就应该差不多了。
- 接下来可以试试学习Fantasy和ET把后端也包圆(ET有点难学,建议专心学习F框架)。
- 或是深入GamePlay研究游戏的业务框架, 例如 : 技能系统 建造系统 连招系统 等等。
- 或者继续研究其他有用的库,例如 :UniTask,YooAsset,luban,hybridCLR 等等来进一步拓展框架
这些都看个人选择了,也涉及到俺的盲区了(太菜了)。
以上就是俺折腾大半年框架的一些踩坑心得,希望有所帮助