一、做游戏为什么需要框架
1.1 没有框架的开发是什么样的
想象你在盖一栋房子。如果没有图纸、没有脚手架,你能盖吗?能。但你会遇到这些问题:
- 墙歪了才发现地基没打好
- 水管和电线混在一起
- 改个窗户位置,整面墙得拆了重来
游戏开发不用框架,几乎一模一样:
| 开发阶段 | 没有框架的典型问题 |
|---|---|
| 初期 | 感觉很快,随便写写就能跑 |
| 中期 | 脚本之间互相引用,牵一发而动全身 |
| 后期 | 加新功能要改 10 个文件,改完原来的功能又坏了 |
| 上线后 | 想热更一个 Bug,发现根本没法热更 |
| 多人协作 | 每个人写法不一样,合并代码就是灾难 |
1.2 框架解决什么问题
一个好的游戏框架,本质上是帮你制定了一套规则和工具:
- 资源管理:资源怎么加载、怎么卸载、怎么打包------有标准流程
- UI 管理:界面怎么打开、怎么关闭、怎么分层------有统一入口
- 事件系统:模块之间怎么通信------不需要互相引用
- 流程控制:游戏启动、登录、主界面、战斗------有清晰的状态切换
- 热更新:代码和资源都能在不重新发版的情况下更新
一句话总结:框架让你把精力花在游戏玩法上,而不是重复造轮子。
二、TEngine 是什么
2.1 一句话定位
TEngine 是一个基于 Unity 的开箱即用游戏开发框架,集成了资源管理、UI 系统、事件系统、网络模块、热更新等完整的游戏开发基础设施。
它的目标是:让独立开发者和小团队不需要从零搭建底层架构,直接开始写游戏逻辑。
2.2 核心特性
- 开箱即用:导入就能跑,不需要复杂配置
- 模块化设计:每个功能是独立模块,用什么导什么
- YooAsset 资源管理:业界成熟的资源打包和加载方案
- HybridCLR 热更新:支持代码和资源双热更
- 完整的 UI 框架:分层管理、生命周期、堆栈式导航
- 事件驱动:模块间松耦合通信
- 持续维护:GitHub 活跃更新,社区支持
2.3 TEngine 的模块全景
scss
┌─────────────────────────────────────────────────────┐
│ TEngine 框架 │
├──────────┬──────────┬──────────┬──────────┬─────────┤
│ 资源管理 │ UI 框架 │ 事件系统 │ 流程控制 │ 网络模块 │
│(YooAsset)│(UIModule)│(EventMgr)│(Procedure│(Network)│
│ │ │ │ + FSM) │ │
├──────────┼──────────┼──────────┼──────────┼─────────┤
│ 对象池 │ 音频管理 │ 计时器 │ 配置表 │ 调试器 │
│(ObjPool) │(AudioMgr)│(TimerMgr)│(DataTable│(Debugger│
│ │ │ │) │) │
├──────────┴──────────┴──────────┴──────────┴─────────┤
│ 热更新(HybridCLR + YooAsset) │
└─────────────────────────────────────────────────────┘
每个模块一句话说明:
| 模块 | 做什么 |
|---|---|
| 资源管理 | 加载/卸载/打包游戏资源 |
| UI 框架 | 管理所有界面的打开、关闭、层级 |
| 事件系统 | 模块间发消息,不需要互相认识 |
| 流程控制 | 管理游戏整体阶段切换 |
| 网络模块 | 与服务器通信 |
| 对象池 | 复用频繁创建/销毁的物体 |
| 音频管理 | 播放背景音乐、音效、语音 |
| 计时器 | 延时执行、倒计时、循环计时 |
| 配置表 | 从 Excel 读取游戏数值 |
| 调试器 | 运行时查看日志、性能、内存 |
| 热更新 | 不重新发版就能更新游戏内容 |
三、为什么选 TEngine
3.1 选几个主流框架对比
| 对比项 | TEngine | GameFramework | QFramework | 不用框架(裸写) |
|---|---|---|---|---|
| 上手难度 | 中等 | 较高 | 低 | 最低(初期) |
| 开箱即用 | 是 | 否(需大量配置) | 部分 | 否 |
| 资源管理 | YooAsset(成熟) | 自带(较老) | 需自己接 | Resources.Load |
| 热更新 | HybridCLR + YooAsset | 需自己接 | 需自己接 | 不支持 |
| UI 框架 | 完整(分层+堆栈) | 完整但复杂 | 简洁 | 自己写 |
| 文档质量 | 中文文档 + 示例 | 中文文档丰富 | 中文教程多 | 无 |
| 适合项目规模 | 中小型商业项目 | 中大型项目 | 小型/原型 | 极小型 Demo |
| 学习曲线 | 前期稍陡,后期省力 | 前期很陡 | 平缓 | 前期平缓,后期灾难 |
| 社区活跃度 | 活跃 | 活跃 | 活跃 | - |
- 除这些之外还有很多有名的框架,比如,ET,MyFramework等等,感兴趣可以自己查看
3.2 什么情况选 TEngine
TEngine 最适合以下场景:
- 独立开发者或 2~5 人小团队:不想花几周搭底层架构
- 需要热更新的手游项目:TEngine 原生集成 HybridCLR + YooAsset
- 有一定 Unity 基础,想进阶到工程化开发:TEngine 的模块设计是很好的学习样本
- 希望用中文文档和社区获得支持:国内开发者维护,交流无障碍
3.3 TEngine vs 裸写:一个真实场景对比
假设你要实现一个常见功能:玩家完成关卡后,弹出结算面板,显示得分和奖励。
裸写方式:
csharp
// GameManager.cs 里
public class GameManager : MonoBehaviour
{
public GameObject resultPanel; // 在 Inspector 里拖引用
public Text scoreText;
public Text rewardText;
public void OnLevelComplete(int score, int reward)
{
resultPanel.SetActive(true);
scoreText.text = "得分: " + score;
rewardText.text = "奖励: " + reward;
// 问题:如果 resultPanel 被销毁了呢?
// 问题:如果要加动画呢?
// 问题:如果有多个面板要管理呢?
// 问题:如果其他脚本也要知道关卡完成了呢?
}
}
TEngine 方式:
csharp
// 1. 定义事件
public static class GameEvents
{
public static readonly int LevelComplete = "LevelComplete".GetHashCode();
}
// 2. 关卡逻辑完成时,广播事件(不需要知道谁在听)
GameEvent.Send(GameEvents.LevelComplete, new LevelResult { Score = 100, Reward = 50 });
// 3. 结算面板自己监听事件(不需要知道谁发的)
public class UIResultPanel : UIWindow
{
protected override void OnCreate()
{
GameEvent.AddEventListener<LevelResult>(GameEvents.LevelComplete, OnLevelComplete);
}
private void OnLevelComplete(LevelResult result)
{
// UI 框架自动管理面板的打开/关闭/层级/动画
FindChildComponent<Text>("ScoreText").text = $"得分: {result.Score}";
FindChildComponent<Text>("RewardText").text = $"奖励: {result.Reward}";
}
protected override void OnDestroy()
{
GameEvent.RemoveEventListener<LevelResult>(GameEvents.LevelComplete, OnLevelComplete);
}
}
关键区别:
- 关卡逻辑和 UI 面板完全解耦------改一个不影响另一个
- UI 的生命周期由框架管理------不会出现空引用
- 想加新面板监听同一个事件?加就行,不用改关卡逻辑的一行代码