该项目是在TEngine框架的基础上,使用Unity开源资源,大量参考开源项目“基于Unity开源框架GameFramewrk实现的一款塔防游戏Demo”制作的一款塔防Demo。
TE框架是一款非常优秀的Unity开源框架,目前相关的文档还不够完善,Demo也比较少。所以本着学习TE框架的心态,效仿花桑大佬复刻了一个基于TE框架的塔防Demo,同时记录一下自己在使用TE框架心得和遇到的坑,希望能给后来人一些经验和启发。
-
Unity: 2022.3.10f1
-
TEngine 基线:
Alex-Rachel/TEngine main@ccc51c3ac7f1a7e7761e85a1c2d1adab8a487962(2026-01-13) -
TEngine release 对照:
TEngine6.1.4@9d7b5d9 -
TEngine
Assets/TEngine/package.json标记版本:6.0.0 -
YooAsset: 2.3.17(
Packages/YooAsset内嵌包) -
HybridCLR: 8.8.0(
https://github.com/focus-creative-games/hybridclr_unity.git#4df417e56ad827cd7e70a54662f0e8bab90aafe9) -
UniTask: 2.5.10
-
Package 兼容差异:因项目固定
Unity 2022.3.10f1,移除 upstreammanifest里的com.unity.modules.accessibility,并将com.unity.ugui对齐到当前编辑器实际提供的1.0.0 -
Tower Defense Template: 1.4.1
本项目测试了了Windows打包运行和热更新,运用到了TE框架里大部分的模块,包括资源模块、事件模块、UI模块、流程模块、FSM模块、多语言模块、内存池和对象池模块。使用了Luban配置表工具、YooAsset打包工具和HybridCLR热更新工具。后续可能会根据该项目出一些TE框架的教程,到时候会一并贴出。
├─ AssetArt // 美术产出物(非运行时直接引用) │ └─ Atlas // 图集原始文件(TexturePacker 等导出的 .tps / .png) ├─ AssetRaw // 原始资源(策划/美术直接维护) │ ├─ Actor // 角色/机关/塔等实体的预制体 │ ├─ Audios // 音频 │ ├─ Configs // 策划配置 │ │ ├─ bytes // Luban生成的二进制表 │ │ └─ Localization // I2 Localization 用的多语言CSV │ ├─ DLL // 第三方托管 DLL(LitJson、Luban.Runtime 等) │ ├─ Effects // 特效源文件(.prefab / .fbx / .shadergraph) │ ├─ Fonts // 字体 │ ├─ Materials // 材质球(sharedMaterial) │ ├─ Res // 运行时真正打进包体的资源(Animations、Models、Particles、Scenes…) │ ├─ Scenes // 主工程 Scenes(实际 Build 用) │ ├─ Shaders // 着色器源文件 │ ├─ UI // UI Prefab(运行时动态加载) │ └─ UIRaw // UI 美术源文件(PSD、切图、未打图集) ├─ Editor // 纯编辑器扩展脚本 ├─ GameScripts // 业务代码(热更 + 原生) │ ├─ HotFix // 游戏热更程序集目录 │ │ ├─ GameLogic // 游戏业务逻辑程序集 │ │ └─ GameProto // 游戏配置协议程序集 │ └─ Procedure // 原生程序集里的流程入口 ├─ HybridCLRGenerate // HybridCLR 生成 Wrappers & AOT dll 的临时目录 ├─ Launcher // 原生启动场景 ├─ MobileDependencyResolver // Google Play Resolver 插件 ├─ Scenes // 真正 Build Settings 里挂的入口场景 ├─ StreamingAssets // 随包体拷贝的只读资源 ├─ TEngine // TEngine 框架本体 │ └─ Extension │ └─ TowerDefenseCompat // 项目兼容层(Entity / Save / Resource) ├─ Packages │ ├─ YooAsset // YooAsset 内嵌包 │ └─ UniTask // UniTask 内嵌包
本项目当前不再以 Assets/TEngine/package.json 的 6.0.0 作为版本依据,而是以 上游 commit pin 作为框架版本依据。
本次升级基线固定为:
Alex-Rachel/TEngine main@ccc51c3ac7f1a7e7761e85a1c2d1adab8a487962
这是一个主线提交,不是 release tag。为了便于和上游 release 对齐,README 同时记录了最近的 release 对照 TEngine6.1.4@9d7b5d9。
HybridCLR 源地址与上游略有不同:上游 manifest.json 使用的是 Gitee 地址,但本项目为了保持现有拉取方式,继续使用 GitHub 地址,并且将 commit 精确 pin 到与上游一致的 4df417e。
由于项目固定在 Unity 2022.3.10f1,Package Manager 依赖不完全照搬 upstream main:com.unity.modules.accessibility 已移除,com.unity.ugui 以当前编辑器可解析的 built-in 版本 1.0.0 为准。
这两个功能仍然保留,玩家侧行为没有变化:
- 进入游戏时仍然只下载默认标签资源,当前默认标签仍为
Base - 进入关卡选择后,仍然会按照关卡配置下载
Level3、Level4等按 tag 拆分的资源
但是业务调用入口已经从旧 fork 的 vendor 接口迁移到兼容层:
- 默认标签下载:
ResourceDownloadCompat.CreateDefaultPackageDownloader() - 关卡按 tag 下载:
ResourceDownloadCompat.CreateResourceDownloaderByTags(new[] { tag }, packageName) - 默认标签配置资产:
Assets/TEngine/Extension/TowerDefenseCompat/Resources/GameResourceDownloadSettings.asset
不再继续使用旧版客制化接口:
IResourceModule.DefaultTagNameIResourceModule.CreateResourceDownloader(string[] tags, string packageName)IResourceModule.IsTagResourcesExist(...)
为了保持 Assets/TEngine 尽量接近上游,原先直接改 vendor 接口的做法已经收口到 extension 兼容层:
- 分包场景加载:由旧的
GameModule.Scene.LoadSceneAsync(packageName, location)改为PackageSceneLoader.LoadSceneAsync(packageName, location) IEntityModule/ISaveModule不再放在 vendorRuntime/Module下,迁移到Assets/TEngine/Extension/TowerDefenseCompat- 兼容层命名空间仍然保持
TEngine,因此业务层类型名基本不需要改
为保证 extension 程序集里的 EntityModule 和 SaveModule 仍能被 ModuleSystem.GetModule<T>() 自动创建,ModuleSystem 增加了跨程序集查找 fallback。
兼容层现在统一位于:
Assets/TEngine/Extension/TowerDefenseCompat/EntityAssets/TEngine/Extension/TowerDefenseCompat/SaveAssets/TEngine/Extension/TowerDefenseCompat/Resource
设计原则:
Assets/TEngine主体保留上游 vendor 代码- 项目定制尽量只放在
Extension/TowerDefenseCompat - 兼容层不依赖
GameModule或GameLogic程序集,便于后续继续跟随上游升级
工程里已经包含了配置表和Luban的依赖,如上图所示点击Gen_Bin-Custom.bat即可生成配置文件和代码到工程中。
项目保留了分包下载逻辑,进入游戏只有下载Base标签的资源,进入关卡选择后会根据表格下载Level3、Level4等关卡资源。当前这套逻辑已经迁移到 Assets/TEngine/Extension/TowerDefenseCompat/Resource,不再继续侵入修改 vendor IResourceModule。
存档模块仍然使用 Sqlite 作为数据持久化方案,但实现已经迁移到 Assets/TEngine/Extension/TowerDefenseCompat/Save,不再放在 vendor TEngine/Runtime/Module/SaveModule。
- 实体模块要优化,当前的实体模块是基于GF框架移植的,目前效果只能说差强人意,仅供参考,后续会进行优化。
存档模块需要完善,现在用的存档模块很简陋,后续会修改。(已添加)- 内存池引用池运用存在问题,现在的用法比较除暴,对象池用的还是TE打飞机框架中的脚本,后续会优化一下。
- 没有运用到服务器和网络功能,后续会考虑添加。
