阅读视图

发现新文章,点击刷新页面。

TEngine 入门系列(一):TEngine 是什么 & 为什么选它

一、做游戏为什么需要框架

1.1 没有框架的开发是什么样的

想象你在盖一栋房子。如果没有图纸、没有脚手架,你能盖吗?能。但你会遇到这些问题:

  • 墙歪了才发现地基没打好
  • 水管和电线混在一起
  • 改个窗户位置,整面墙得拆了重来

游戏开发不用框架,几乎一模一样:

开发阶段 没有框架的典型问题
初期 感觉很快,随便写写就能跑
中期 脚本之间互相引用,牵一发而动全身
后期 加新功能要改 10 个文件,改完原来的功能又坏了
上线后 想热更一个 Bug,发现根本没法热更
多人协作 每个人写法不一样,合并代码就是灾难

1.2 框架解决什么问题

一个好的游戏框架,本质上是帮你制定了一套规则和工具

  • 资源管理:资源怎么加载、怎么卸载、怎么打包——有标准流程
  • UI 管理:界面怎么打开、怎么关闭、怎么分层——有统一入口
  • 事件系统:模块之间怎么通信——不需要互相引用
  • 流程控制:游戏启动、登录、主界面、战斗——有清晰的状态切换
  • 热更新:代码和资源都能在不重新发版的情况下更新

一句话总结:框架让你把精力花在游戏玩法上,而不是重复造轮子。


二、TEngine 是什么

2.1 一句话定位

TEngine 是一个基于 Unity 的开箱即用游戏开发框架,集成了资源管理、UI 系统、事件系统、网络模块、热更新等完整的游戏开发基础设施。

它的目标是:让独立开发者和小团队不需要从零搭建底层架构,直接开始写游戏逻辑。

2.2 核心特性

  • 开箱即用:导入就能跑,不需要复杂配置
  • 模块化设计:每个功能是独立模块,用什么导什么
  • YooAsset 资源管理:业界成熟的资源打包和加载方案
  • HybridCLR 热更新:支持代码和资源双热更
  • 完整的 UI 框架:分层管理、生命周期、堆栈式导航
  • 事件驱动:模块间松耦合通信
  • 持续维护:GitHub 活跃更新,社区支持

2.3 TEngine 的模块全景

┌─────────────────────────────────────────────────────┐
│                    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 裸写:一个真实场景对比

假设你要实现一个常见功能:玩家完成关卡后,弹出结算面板,显示得分和奖励。

裸写方式:

// 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 方式:

// 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 的生命周期由框架管理——不会出现空引用
  • 想加新面板监听同一个事件?加就行,不用改关卡逻辑的一行代码
❌