分类 | 模块 | 完成状态 |
---|---|---|
UI | VP框架 | 完成 |
UI | 导出生成代码 | 完成 |
UI | 管理器 | 完成 |
UI | 自带控件功能扩展 | 完成 |
UI | 更多常用控件 | 完成 |
Productivity | 日志增强 | 完成 |
Productivity | 日志写入文件 | 完成 |
Productivity | 游戏调试图表 | 完成 |
Productivity | 查找资产所有引用 | 完成 |
Common | AssetBundle打包和加载管理 | 完成 |
Common | 事件系统 | 完成 |
Common | 单例模板 | 完成 |
Common | 游戏状态机 | 完成 |
Common | 本地化解决方案 | 待规划 |
Data | 配置表管理 | 完成 |
Data | 数据追踪 | 待规划 |
Data | 可序列化的字典 | 待规划 |
Util | 预定义宏管理 | 完成 |
Util | 压缩功能 | 完成 |
Util | 枚举标签 | 完成 |
Util | 编译时间显示 | 完成 |
Util | Yield优化 | 完成 |
Util | 通用对象池 | 完成 |
Util | 自动添加文件头注释 | 完成 |
Util | 统一的配置入口 | 完成 |
Util | 实用工具类 | 完成 |
VP即View-Presenter,UI采用界面逻辑分离的思路,方便UI人员随时修改且不会影响到具体的业务逻辑。
每一个UI界面都对应2个cs文件,FooView.cs
和FooPresenter.cs
。程序人员只在Presenter文件里进行开发,View文件是自动生成自动更新的,保存了需要程序访问的UI控件的引用。每当UI人员对界面进行了修改,直接导出View文件即可,不会影响到具体的业务逻辑,最大的好处是不需要人工在编辑器里一个一个地拖控件,一切都是自动化的。
根据Prefab中UI控件对象的命名,导出工具可以知道控件的类型,然后生成对应的代码,以便程序人员获取相应控件对象的引用。
亮点在于可以在编辑器而不是运行时去寻找UI控件的引用,大大减少了初始化所需时间。
当增加新的UI控件时,不会对业务逻辑造成任何影响。当删除现有的UI控件时,如果直接删除View文件中的引用,Presenter中的代码会编译失败,所以当UI人员删除控件时要提前通知程序人员,最好让程序人员来导出生成新的View代码。
框架中的UI基于UGUI开发,全局只有一个Canvas,会在框架初始化时创建,并标记为DontDestroyOnLoad
。提供UI界面的CRUD,分辨率自适应等功能。
特别介绍一点,UI界面关闭后并不会直接Destroy掉,而是通过调整坐标隐藏了起来,再次打开此界面时会先查找有没有被隐藏的此类界面,有则重新显示,否则创建一个新的。
- 给
Button
增加了读写按钮文本(如果存在)的扩展方法 - 给
ToggleGroup
增加了统一回调,可以直接返回选中项的ID(需要手动设置)
暂时只加了一个进度条(ProgressBar
),用于显示读取进度等。
把Unity自带的Debug.Log()
封装了一层,实现了更多功能。现在可以自定义输出日志级别,支持设定日志所属模块,配合控制台增强可以按模块进行筛选。
全屏的图表,随时间更新,支持多个指标如帧率等。一定程度上把Unity的Profile做在游戏里,方便在真机上调试。
在Project视图中右键单击一个资产如某个Texture,可以快速找到项目中有哪些Asset引用了这个Texture,结果在Console中显示。
重新设计了一套事件机制,没有采用全局唯一的事件分发器,而是支持任意对象通过组合的方式使用派发器,只给与自己有关的监听者派发事件。比常用的全局派发器更灵活。
框架的UI事件就是基于这套事件系统实现的,每个需要发事件的UI控件都有自己的派发器,由相应的View监听,即一个监听者对应多个发送者。
游戏中常用的用法是给每一个Actor绑定一个派发器,关心某个事件的系统可以向这些Actor注册相应事件的监听,收到消息时可以很轻易的知道发送者是谁,以便进行进一步的处理。
很常用的单例模式,框架提供了普通单例类和单例MonoBehavior
在Unity中如果经常使用协程,则会经常用到如new WaitForEndOfFrame()
的语句,这会导致许多无谓的GC。框架提供了常用Yield的缓存。
在每个新的C#脚本文件的头部都自动添加注释信息,包括创建日期,创建者,文件名,所属程序集等。
用于UI代码导出路径,数据表导入路径,本地化表导入路径的配置。如果把路径写死在代码里不利于跨项目复用,所以就用EditorPrefs
类实现了一个GUI的配置窗口。
常用的工具函数,举例如下:
- 获取当前的Unix时间戳
- 根据名字递归寻找某GameObject下的所有子对象
- 计算字符串的MD5
- 返回数组、列表中的随机一个元素
- 根据指定权重随机返回结果