|
推荐我个人开发的MyFramework,github可以搜到。
https://github.com/ZHOURUIH/MyFrameworkGitHub - ZHOURUIH/MyServerFramework上面是客户端和配套服务器的仓库.网络部分可随意替换不一定非要使用这里提供的服务器.配套服务器是使用C++写的,也是包含非常多的框架代码.阅读上手难度相比于其他语言会更大一些,所以可以根据自己的需求使用其他服务器,以及网络传输协议.
缺点是例子很少,但是里面功能很全,经过多个商业化项目的迭代完善,包含了很多功能。
基本系统架构

基于hybridclr的完全热更,也就是除了启动的更新过程以外,其他的框架层应用层代码是全部可热更的.
hybridclr是一个完全无门槛的,且几乎没有性能损耗的热更工具,是目前最优的游戏热更新方案.
通用对象池设计
继承ClassObject即可使用对象池进行分配.
class A : ClassObject{}
using var a = new ClassScope(out A obj);
即可在当前作用域内创建一个临时使用的类对象,无需担心GC以及对象生命周期问题.
完全封装的全局输入系统,用于统一界面层和场景层的鼠标事件
GlobalTouchSystem是一个完全自定义的输入事件检测系统,不再依赖于UGUI的EventSystem,直接从Input检测触点,以及实现如进入,离开,按下,抬起,拖拽,双击,长按等等的事件,并且全平台通用.而且完全统一了3D场景和2D界面的输入事件,无需担心还要去单独处理场景的点击与界面的点击.
命令设计模式,解耦数据层与表现层
自定义的CommandSystem,将数据与界面的交互部分放到命令类中,使其成为一个对象.在开发期间非常方便去查询指定的逻辑代码.使代码结构更加清晰.
同时将命令对象化以后也可以进行延迟执行,使其能够直接用在多线程中,也顺带实现函数延迟调用.
如果担心要创建命令对象而产生性能损耗,也可以直接将执行过程写为静态函数.
自定义对ugui的完全封装,自定义鼠标的操作事件响应
对常用的UGUI组件,如Image,Text,RawImage,等进行了封装.同时添加了一些常用自定义的控件,如图片数字显示,并且重写底层优化数字图片的渲染,使同屏显示大量伤害数字也不会对性能有明显影响.还有常用的界面对象池,滑动窗口,勾选框,下拉框,滑动条等等.
轻松实现分辨率适配
自定义的ScaleAnchor,ScaleAnchor3D,PaddingAnchor,PaddingAnchor3D可轻松应对绝大部分的屏幕自适应需求,而且也可对UI上的特效进行自适应缩放.而且只需要在编辑器中给UI的Prefab添加适配组件即可,可以使用快捷键对选中节点下的所有递归子节点添加适配组件,不需要修改任何代码.
适配的核心思想就是默认等比缩放,再次就是根据宽高独立缩放.或者停靠到父节点的指定位置.这样已经满足绝大部分的适配需求.
而且这样做有一个很大的好处,因为去掉了UGUI的锚点影响,所以窗口大小就是固定的,适配前和适配后非常明确.不会被引擎自动修改.这样就不会产生各种潜在的跟窗口大小有关的问题.
多语言本地化功能
只需要指定对应需要的文本或者按文件名提供不同语言的图片即可实现多语言动态切换.使用中文作为key,可直接在代码中照常写中文字符串,在设置显示到界面上时,会自动转换为对应的语言.图片上带文字的也同样可以在制作时直接使用中文的图片,只需要将图片名以_Chinese结尾,在显示时就会自动转换为对应的语言的图片.并且添加了代码中中文检测工具,直接收集代码中写死的所有中文,不会遗漏任何一个需要转换的文本.
这样做最大的好处就是游戏层几乎无法感知到多语言.开发时基本就按照没有多语言的条件去做.
自定义的角色状态机
实现角色任意的逻辑状态跳转。可轻松实现角色buff,角色行为控制.状态可设置共存,互斥,优先级保留等等的规则,而且搭配状态组,可以很容易去控制大量的状态.我自己的项目中状态类有几百个,也非常好管理.
角色系统
对游戏中的角色对象进行了抽象,继承关系如下

字符串,字典,列表,哈希表的扩展函数
简化绝大部分的集合类操作.对这些常用的容器添加了大量的扩展函数,可以直接当作成员函数来调用,比如List的addUnique,addNotNull,setRange,move,getSafe,safe等.可极大程度上简化代码.
比如一个很常见的情况,在遍历一个列表时要去对这个列表进行修改,如果直接写肯定是会报错的.所以封装了一个SafeList.支持在遍历时去修改列表.
逻辑场景和流程设计,方便规划游戏的运行阶段
GameScene用于规划游戏的逻辑场景,比如登录场景,大厅场景,战斗场景等等.每个GameScene包含多个SceneProcedure,也就是划分具体的流程,比如战斗开始,战斗准备,战斗进行中,战斗结算等.而且允许SceneProcedure嵌套,用于划分更加细致或者分支流程.并且流程跳转逻辑符合常规思维.
算是这个框架中的一大特点.在所有我接手过的项目里,几乎看不到完善的游戏运行状态管理.全是一个State枚举就没了.
大量的数学计算,字符串操作,unity函数封装,时间类函数封装,csharp函数封装,二进制以及字节操作函数封装等
几乎包含了可能用到的绝大多数工具函数,数学计算中诸如各种几何,三角函数,角度单位转换,随机操作等等跟数学计算相关的工具函数.UnityUtility中也包含了大量对于Unity功能的封装,比如碰撞检测,GameObject查找,日志打印,视图计算,射线计算,空间转换等等.二进制工具函数BinaryUtility中也封装了大量的序列化工具函数,可实现按字节序列化或者按位序列化,以及大量的位操作函数.
完善的资源管理系统
底层自动根据编辑器或者真机来使用AssetDatabase或者AssetBundle。应用层完全无需修改代码。而且AssetBundle还支持异步加载时自动下载本地不存在的资源。并且对于不同类型的资源还再次封装了对应的系统,比如EffectManager,PrefabPoolManager,TPSpriteManager等.界面使用的图集是手动通过TexturePacker来生成的.如果想要使用Unity的SpriteAtlas也可以自己修改.
支持多个平台
windows,ios,android,webgl。
谷歌分发PAD支持
以install-time的方式,设置绝大部分资源为在安装时再跟安装包一起下载,无需担心上传GooglePlay的包体限制.
谷歌登录,谷歌支付
包含接入谷歌登录和支付的java代码,支持本地化显示商品价格
表格配置
可直接读取SQLite表格,也可以将Excel转换为自定义表格文件后进行读取
自定义序列化类用于网络通信
网络通信序列化可根据自己的需求选择按位序列化,按字节序列化,json序列化.
其中按位序列化带宽占用最小,占用带宽比Protobuf还小.
按字节序列化,由于没有优化手段,完全按照变量类型的大小去序列化的.所以带宽占用较大,不过由于解析过程简单,执行效率也最高.
json序列化一般用在http的通信上,tcp不推荐使用.
至于选择tcp还是udp,框架中都支持,但是我个人的项目选择使用tcp,不会有明显的性能瓶颈.
热更代码的代码混淆
因为热更代码占了绝大部分,所以只混淆热更代码已经基本满足绝大部分需求。
直接集成到unity编辑器中的检测工具
代码合理性检测工具,资源合理性检测工具。
极少的插件依赖
依赖或者使用到的外部插件只有TexturePacker,AvProVideo(添加了指定的宏以后才能使用,如果不需要可以不添加宏),经过自己修改优化后的UnityObfuscator,最新的版本已经换成了更加强大的Obfuz.也是因为UnityObfuscator中用到了Mono.Cecil在Unity6下会出现奇怪的文件流错误,在unity2022中是正常的,所以项目更新到Unity6以后,就不得不使用Obfuz了.
还有非常多的特性没有列出来。。。
框架的设计目标就是用最少的代码,消耗最小的精力去开发一个游戏.我做游戏中踩过的坑,决不会让使用这个框架的人再踩一次.
在一行代码不超过130个字符的前提下,尽量减少代码行数,能写成一行就不会写成两行,但是大括号基本都需要换行.
框架中的注释也比较完善,几乎大部分的成员变量都添加了注释,比如



 |
|