- CoreLib层主要是提供一系列与不依赖Knight框架的基础库,主要是由两个Package构成:Knight.Core和Knight.Core.Unity。
- 本次设计将核心库分离成两个,一个是纯C#的代码封装,另一个是包含了Unity API的代码封装,这样做的目的主要是为了满足游戏逻辑脱离Unity的需求,比如战斗逻辑需要跑服务器上。
- 提供了TObjectPool泛型对象池和GameObjectPool对象池。
- 引入UniTask的异步集成库,框架层和游戏逻辑已经完全摒弃Coroutine协程调用,全部采用Async/Await的方式来处理异步逻辑。
- 同时提供了Coroutine和Async/Await两者之间的相互调用和转换。
- 提供了多语言本地化的基础逻辑封装接口,可配合配置表GameConfig/LanguageTable来实现多语言的切换。
- 重新设计事件系统,采用Class/Object的思想来表达:事件类型/事件监听实例。一个事件类表示一个事件类型,类实例的对象表示一个事件监听绑定。
- 采用模板类型构造和分发事件对象,彻底消除以前object参数传递带来的数据装箱和拆箱的GC Alloc。
- 提前获取到游戏中的各个模块Assembly中的类型,以实现在任何位置获取想要的Type,而无需关心类型反射的跨域问题。
- 在编辑器和运行时都可用。
- 提供方便的代码生成接口,以满足框架层和逻辑层的代码生成工具的需求。
- 提供一系列基础类的扩展方法,以简化代码。
- 提供一系列基础工具辅助类(反射、路径解析、MD5计算、随机数、Log打印、单例模板)。
- 提供一个异步实例化对象的管理器,可用于异步实例化GameObject对象。
- 提供了一个WebRequest工具,可用于从网络上下载文件和内容。
- hybridclr: 是一个特性完整、零成本、高性能、低内存的Unity全平台原生c#热更新解决方案。 地址:https://github.com/focus-creative-games/hybridclr
- NaughtyAttributes: 一个脚本Inspector UI扩展库,通过Attribute标签来实现的Editor扩展。地址:https://github.com/dbrizov/NaughtyAttributes
- UniTask: 一个为Unity集成的一个0GC的高性能的async/await库。地址:https://github.com/Cysharp/UniTask
- protobuf: google开源的一个二进制序列化库,用于网络协议解析。地址:https://github.com/protocolbuffers/protobuf
- TouchSocket: 是一个功能强大且易于使用的.NET 网络通信框架,适用于C#、VB.Net 和 F#等语言。它提供了多种通信模块,包括TCP、UDP、SSL、WebSocket、Modbus等。支持解决TCP黏包分包问题和UDP大数据包分片组合问题。框架支持多种协议模板,快速实现固定包头、固定长度和区间字符等数据报文解析。地址:https://github.com/RRQM/TouchSocket
- Nino: 一个高性能的二进制序列化库。地址:https://github.com/JasonXuDeveloper/Nino
- FancyScrollView: 一个UI无限循环列表库。地址:https://github.com/setchi/FancyScrollView
- UnityIngameDebugConsole: 一个用于运行时显示log的工具。地址:https://github.com/yasirkula/UnityIngameDebugConsole
- Framework层主要包扩:
- Assetbundle资源管理(Knight.Framework.Assetbundle)
- 代码热更新(Knight.Framework.Hotfix)
- 图形渲染(Knight.Framework.Graphics)
- 网络和协议(Knight.Framework.Network/Knight.Framework.Protobuf)
- 游戏存档(Knight.Framework.GameSave)
- MVMC的UI框架(Knight.Framework.UI)
- 序列化(Knight.Framework.Serializer)
- Shader变体管理(Knight.Framework.ShaderVariant)
- 该层依赖于CoreLib和ThirdLib
- 自定义资源标签配置工具,根据配置决定哪些资源需要打包以及打包时的策略
- 统一资源加载接口,自动根据依赖项加载资源
- 自定义资源版本信息文件,实现资源包下载、更新、版本管理流程
- 实现资源管理模块Editor Simulate和非Editor的加载接口统一,可以根据不同的资源类型自由切换
- 伪装一些无需构建assetbundle包的资源加入到版本信息文件中,例如视频资源,可实现和assetbundle同样的逻辑进行更新和下载
- 针对在资源打包时对assetbundle的文件头进行偏移加密,并在读取时解密
- 使用hybridclr实现C#的全逻辑热更新
- 热更新DLL加入Assetbundle资源包中进行管理
- 此种代码热更方式,不再关心热更代码的特殊写法,正常编写c#逻辑即可
- 提供图形渲染分级的检测和设置(未完成,待续)
- 提供URP管线摄像机堆栈的叠层管理,控制UI和场景渲染的摄像机顺序(未完成,待续)
- 引入TouchSocket作为网络连接和数据传输的底层,基于该库封装了TCP连接和数据传输的接口
- 引入Protobuf作为网络协议数据传输格式,在传输时序列化和反序列化网络数据
- 提供一个用于游戏本地存档的库
- 采用静态注入的方式调用变量设置时标记Dirty,然后在Update中检测哪些文档是Dirty的需要存储,使用多线程将内容写入本地文件
- Android本地文件路径写入的是隐藏路径,对外不可见
- 对写入的文件做文件流内容的异或加密处理
- 可兼容数据版本,例如存档数据新增字段仍然能够正确的读取数据
- 提供了一个以UGUI为基础的图集管理模块UIAtlasManager,可根据图片名字获取相应的图片的Sprite或者Texture2D对象
- 实现轻量级的基于MVVM的数据绑定,完全分离数据逻辑和UI显示逻辑,提供一系列的数据、事件绑定脚本
- 提供ViewController用于控制Model数据和ViewModel数据
- 提供基于UGUI的常用扩展控件组(后续逐渐添加)
- ImageReplace/RawImageReplace 用于在代码中动态替换一张图片
- EmptGraphics 用于指定一个空白UI区域是否可以接受点击事件
- Gradient 字体渐变脚本
- FancyScrollRect 循环列表
- GrayGraphics 变灰组件
- RedPoint 小红点
- 该模块提供两种序列化方式,一种是基于Nino的二进制序列化,它具备高性能、可自动生成代码、可兼容数据版本的特点
- 另一种是纯二进制序列化,采用代码生成的方式实现
- 目前两种在框架中都有用到,后续将考虑全部替换为Nino的序列化
- 该模块提供了Shader变体管理的功能,可全局收集用到的Shader变体,可增量更新新的Shader变体
- 使用UIElments实现的一个资源包配置和构建的工具,用于管理和打包assetbundle
- 将Excel表格导出成Json格式的数据配置和C#的配置代码
- 一个三方库,用于游戏中运行时查看日志
- 代码生成工具,可以生成序列化代码、配置和协议的ViewModel代码等等
- 自动构建版本的管线,整合版本构建流程,实现自动版本构建的工具(未完成,待续)
- 本框架的目标是将游戏的所有逻辑写在热更新DLL里面。
- 游戏主要由两个部分构成,热更新模块和资源。
- GameAssets是原始资源,这些原始资源将会被打包成为Assetbundle包供游戏使用。
- Assetbundle Packages是用在游戏中的原始资源包。
- 热更新端的核心库(Hotfix Core Lib)
- GUI Logic,游戏的GUI逻辑部分
- Battle Logic,游戏的战斗逻辑部分