README.md

March 26, 2026 · View on GitHub

DGame

Unity 游戏框架解决方案

基于 TEngine 深度优化演进,为商业级游戏开发打造

Unity Version License Last Commit Issues Stars


📖 简介

DGame 是在 TEngine 基础上深度优化演进的 Unity 游戏框架。保留 TEngine 核心优势的同时,针对商业游戏开发需求新增了多个核心模块,并对现有系统进行了部分优化

📝 本文档由 AI(Claude)自动生成,内容可能存在偏差,如有疑问请参考源代码或提交 Issue。

新增功能均在多个商业化游戏及百万DAU项目经过验证。

Fantasy线和TE同步接入服务器框架Fantasy,区别在于TE接入的就更纯净简洁,本项目可能会做更多的项目细节和实用工具方法处理。

本框架已支持 Codex 的基础 skill,其中 dgame-dev 可用于辅助理解本仓库的目录结构、客户端架构与常见开发流程。

✨ 核心特性

特性描述状态
🚀 模块化设计高内聚低耦合的模块化架构,基于接口的模块管理继承自 TEngine
🔥 热更新支持集成 HybridCLR,支持全平台 C# 代码热更新继承自 TEngine
📦 资源管理集成 YooAsset,支持资源分包、边玩边下继承自 TEngine
📋 配置系统基于 Luban 的配置表解决方案继承自 TEngine
🧩 流程管理基于状态机的流程系统,管理游戏生命周期继承自 TEngine
🔄 MonoDriver替代 UpdataDriver,统一生命周期驱动⚡ 优化改进
🌍 多语言ILocalizationModule,接口驱动、8 种语言支持⚡ 重新实现
⏱️ GameTimer替代 TimerModule,支持循环次数限制⚡ 优化改进
🎲 MemoryCollector替代 MemoryCollection,Spawn/Release 语义⚡ 优化改进
🛠️ 编辑器工具工具栏扩展、Spine 助手、Odin 支持、快速创建入口🆕 新增功能
🎯 AnimModule封装 Playable API,与 FsmModule 深度集成🆕 新增功能
🕹️ InputModule统一输入处理、多点触控、手势识别🆕 新增功能
🏊 GameObjectPool专用 GameObject 对象池🆕 新增功能
🎨 UIBindComponentUI 代码自动生成、UIButton/UIImage/UIText 组件扩展🆕 新增功能
🔴 RedDotModule树状结构红点管理,编辑器可视化配置🆕 新增功能
🎬 FrameSprite序列帧动画系统,对象池复用🆕 新增功能
🎮 GMPanelGM 调试面板,配置表驱动🆕 新增功能
💾 DataCenter统一数据管理,生命周期事件通知🆕 新增功能
💽 ClientSaveDataMgr客户端存档系统,JSON 序列化、按角色存档🆕 新增功能
📜 SuperScrollView高性能循环滚动视图🆕 新增功能
📝 Text 系统多语言文本系统(G.cs, TextConfigMgr)🆕 新增功能
🔧 SingletonSystem单例系统🆕 新增功能
👁️ GameTickWatcher游戏帧监听🆕 新增功能

📚 目录


🆕 新增功能一览

Runtime 层新增

模块文件路径说明
🎯 AnimModuleRuntime/Module/封装 Playable API,与 FsmModule 集成
🕹️ InputModuleRuntime/Module/统一输入处理、多点触控、手势识别
🏊 GameObjectPoolRuntime/Module/专用 GameObject 对象池
⏱️ GameTimerRuntime/Module/替代 TimerModule,支持循环次数限制
🔄 MonoDriverRuntime/Module/替代 UpdataDriver

HotFix 层新增

模块文件路径说明
🔴 RedDotModuleGameLogic/Module/树状结构红点管理,编辑器可视化配置
💾 DataCenterGameLogic/DataCenter/统一数据管理,生命周期事件通知
💽 ClientSaveDataMgrGameLogic/DataCenter/客户端存档系统,支持按角色存档
🎬 FrameSpriteGameLogic/Common/序列帧动画系统,对象池复用
🎮 GMPanelGameLogic/GMPanel/GM 调试面板,配置表驱动
📜 SuperScrollViewGameLogic/Module/UIModule/高性能循环滚动视图(ListView/GridView/StaggeredGridView)
📝 Text 系统GameLogic/Text/多语言文本系统(G.cs, TextConfigMgr)
🔧 SingletonSystemGameLogic/SingletonSystem/单例系统
👤 PlayerDataGameLogic/PlayerData/玩家数据管理
👁️ GameTickWatcherGameLogic/GameTickWatcher/游戏帧监听

Editor 层新增

模块文件路径说明
🛠️ UnityToolBarExtendEditor/工具栏扩展(场景启动、播放模式)
🎨 SpineModelHelperEditor/Spine 模型辅助处理
⚙️ CreateGameEntryEditor/Settings/快速创建 GameEntry 对象
📦 OdinEditor/Odin/Odin 插件支持
🚪 OpenFolderHelperEditor/OpenFolder/快速打开项目文件夹

⚡ 优化改进一览

模块TEngineDGame主要改进点
⏱️ 计时器TimerModuleGameTimer返回对象可操作、支持循环次数限制、DGameLinkedList
🌍 多语言LocalizationModuleILocalizationModule接口驱动设计、8 种语言支持、事件通知机制
🎲 内存池MemoryCollectionMemoryCollectorSpawn/Release 语义、支持批量释放、Capacity 属性
🎨 UI 系统基础组件UIBindComponent + 组件扩展代码自动生成、UIButton/UIImage/UIText 组件扩展
📡 事件系统GameEventMgrEventDispatcher分离设计、接口包装支持
📝 日志系统LogDGameLog更简洁的日志封装

🚀 快速开始

环境要求

项目要求
Unity 版本2021.3.30f1c1(推荐)或更高
开发环境.NET 4.x / .NET Standard 2.1
支持平台Windows、Android、iOS
IDEVisual Studio 2019+ 或 JetBrains Rider

快速上手

  1. 克隆项目

    git clone https://github.com/AmaniDawn/DGame.git
    
  2. 打开项目

    • 使用 Unity 2021.3.30f1c1 打开 GameUnity 目录
  3. 运行项目

    • 打开 Assets/Scenes 下的 LaunchScene 启动场景
    • 点击运行按钮启动游戏
  4. 热更新设置(可选)

    • 运行菜单 HybridCLR/Install... 安装 HybridCLR
    • 运行菜单 HybridCLR/Generate/All 生成必要的代码
    • 构建热更新 DLL 和资源包

🤖 AI 协作开发(Codex + OpenSpec)

本仓库已经完成了基础的 codex skills 支持,相关能力位于项目根目录的 .codex/skills/,可用于辅助理解 DGame 的目录结构、客户端架构、热更开发流程,以及基于 OpenSpec 的变更提案、实现与归档工作流。

推荐使用方式

推荐优先使用 Codex CLI,并结合 OpenSpec 进行规格驱动开发:

  1. 使用 Codex CLI 在仓库内完成代码阅读、修改、调试与文档维护
  2. 使用 OpenSpec 先沉淀需求、设计和任务拆解
  3. 再通过 Codex + OpenSpec 按任务逐步实现、验证与归档

适合本仓库的典型流程如下:

# 1. 进入仓库
cd DGame

# 2. 初始化或更新 OpenSpec 结构
openspec init
# 初始化时推荐选择 Codex 作为 AI 工具

# 3. 启动 Codex CLI
codex

# 4. 在 Codex 中按 OpenSpec 工作流推进
# 例如:先提 proposal,再实现,再 archive

Codex CLI 安装

1. 安装 Node.js

  • 建议使用 Node.js 20+,并确保 npm 可用

2. 全局安装 Codex CLI

npm install -g @openai/codex

3. 登录 Codex

可任选一种方式:

# 使用 ChatGPT 账号登录
codex --login

如果需要通过 API Key 使用,推荐优先使用 ccswitch 管理不同 Provider、模型配置与密钥,再切换到 Codex 使用。

ccswitch 仓库:

或手动配置 OpenAI API Key:

# macOS / Linux
export OPENAI_API_KEY="<YOUR_OPENAI_API_KEY>"

# Windows PowerShell
$env:OPENAI_API_KEY="<YOUR_OPENAI_API_KEY>"

4. 在仓库根目录启动

codex

常用模式示例:

codex --auto-edit
codex --full-auto

提示:Codex CLI 官方对 macOS / Linux 支持更完整;如在 Windows 环境下遇到兼容性问题,建议优先使用 WSL。

OpenSpec 安装与初始化

1. 全局安装 OpenSpec CLI

npm install -g @fission-ai/openspec@latest

2. 验证安装

openspec --version

3. 在仓库根目录初始化

openspec init # 初始化时推荐选择 Codex 作为 AI 工具

初始化过程中,当 CLI 询问要集成的 AI 工具时,推荐优先选择 Codex

初始化后通常会生成或更新以下内容:

  • openspec/:用于存放当前变更、规范与归档
  • AGENTS.md:提供给 AI 助手的统一协作说明
  • 针对所选 AI 工具的辅助命令或集成配置

4. 常用 OpenSpec 命令

# 查看当前变更
openspec list

# 查看某个变更状态
openspec status --change "<change-name>"

# 校验某个变更
openspec validate "<change-name>" --strict

# 归档已完成变更
openspec archive "<change-name>" --yes

本仓库中的建议工作流

  1. 先运行 openspec init,保证仓库具备标准化规格目录与 AI 协作入口
  2. 使用 codex 进入仓库,在需求较明确时优先走 OpenSpec 流程
  3. 先产出 proposal / design / tasks,再进入实现阶段
  4. 实现过程中优先复用本仓库已有的 .codex/skills/AGENTS.md
  5. 开发完成后执行验证,并归档对应 OpenSpec change

参考文档


🎁 新增功能详解

🛠️ 编辑器工具 (Editor)

工具功能
UnityToolBarExtend左右工具栏增强、场景快速启动、播放模式控制
SpineModelHelperSpine 模型辅助处理
CreateGameEntry一键创建 GameEntry 对象
OdinOdin 插件支持
OpenFolderHelper快速打开项目文件夹

🔴 红点系统 (RedDotModule)

树状结构红点管理,编辑器可视化配置,代码自动生成。

// 创建红点
var redDot = CreateRedDot(RedDotPathDefine_Gen.Main.Bag.Equipment, parentTransform);

// 更新红点状态
RedDotModule.Instance.SetState(RedDotPathDefine_Gen.Main.Bag.Equipment, true);

// 设置红点数量
RedDotModule.Instance.SetNumber(RedDotPathDefine_Gen.Main.Quest.Daily, 5);

🎬 序列帧动画 (FrameSprite)

高效序列帧播放,对象池复用,异步加载。

var frameSprite = await FrameSpriteMgr.PlayAsync(
    parent: transform,
    atlasName: "EffectAtlas",
    spriteNames: new[] { "frame_0", "frame_1", "frame_2" },
    frameRate: 30,
    loopCount: 1
);

🎮 GM 系统 (GMPanel)

配置表驱动的调试面板。

GMModule.ExecuteCommand("AddGold 1000");
GMModule.ExecuteClientGm(GmCommandId.AddGold);

💾 数据中心 (DataCenter)

统一数据管理,生命周期事件通知。

public class PlayerData : DataBase
{
    public int Level;
    public long Gold;
}

var playerData = DataCenterModule.GetData<PlayerData>();
playerData.Gold += 100;

💽 客户端存档系统 (ClientSaveDataMgr)

基于 PlayerPrefs 的存档系统,支持 JSON 序列化和按角色存档。

特性:

  • JSON 序列化/反序列化
  • PlayerPrefs 本地存储
  • 支持按角色 ID 存档(多角色支持)
  • 自动加载、批量保存
// 定义存档类
[ClientSaveData("Setting", PerRoleID = false)]
public class SettingSaveData : BaseClientSaveData
{
    public int MusicVolume = 50;
    public bool IsFirstLogin = true;
}

// 获取存档(自动加载)
var setting = ClientSaveDataMgr.Instance.GetSaveData<SettingSaveData>();
setting.MusicVolume = 80;
setting.Save();  // 保存

// 批量保存所有存档
ClientSaveDataMgr.Instance.SaveAllClientData();

🎯 动画模块 (AnimModule)

封装 Playable API,与 FsmModule 深度集成。

public class IdleState : BaseState<Character>
{
    public override void OnEnter()
    {
        PlayAnimation("Idle");  // 状态切换自动播放动画
    }
}

🕹️ 输入模块 (InputModule)

统一输入处理,多点触控支持。

var inputModule = ModuleSystem.GetModule<IInputModule>();
inputModule.OnClick += (position) => { };
inputModule.OnLongPress += (position, duration) => { };
inputModule.OnDrag += (delta) => { };

🏊 GameObject 对象池 (GameObjectPoolModule)

专用 GameObject 对象池。

var pool = ModuleSystem.GetModule<IGameObjectPoolModule>();
var obj = pool.Spawn("Bullet");
pool.Despawn(obj);

📜 SuperScrollView

高性能循环滚动视图。

loopListView.InitListView(itemCount, (index, item) => {
    var itemLogic = item as MyItem;
    itemLogic.SetItemData(index);
    return itemLogic;
});

📝 Text 系统

多语言文本系统(G.cs, TextConfigMgr, TextDefine)。

🔧 SingletonSystem

单例系统,统一管理单例模式。

👁️ GameTickWatcher

游戏帧监听,用于性能监控和调试。


⚡ 优化改进详解

⏱️ GameTimer(替代 TimerModule)

  • 返回可操作对象,支持循环次数限制
  • 使用 DGameLinkedList 优化链表结构
var timer = GameTimer.CreateLoopGameTimer(1f, () => DLogger.Info("每秒执行"));
timer.LoopCount = 5;  // 只执行 5 次
timer.Paused = true;  // 暂停

🌍 ILocalizationModule(替代 LocalizationModule)

  • 接口驱动设计
  • 8 种语言支持(中/英/繁/韩/日/越/印尼)
  • 事件通知机制

🎲 MemoryCollector(替代 MemoryCollection)

  • Spawn/Release 语义更清晰
  • 支持批量释放
var obj = MemoryCollector.Spawn<MyClass>();
MemoryCollector.Release(obj);

🎨 UI 系统(UIBindComponent + 组件扩展)

组件扩展:

组件功能
UIButton点击保护、缩放效果、音效、长按、双击
UIImage镜像翻转、圆角、遮罩
UIText渐变色、字间距、圆形排列、阴影
RichTextItem图文混排、超链接、动画表情

📡 EventDispatcher(替代 GameEventMgr)

  • 分离设计
  • 接口包装支持

🧩 核心模块

模块接口描述来源
🎮 Mono 驱动IMonoDriverUnity 生命周期驱动TEngine
📦 资源管理IResourceModuleYooAsset 资源管理TEngine
🔄 状态机IFsmModule有限状态机管理TEngine
🔊 音频IAudioModule背景音乐与音效管理TEngine
🎬 场景ISceneModule场景加载与切换TEngine
🌍 多语言ILocalizationModule8 种语言支持,接口驱动⚡ 重新实现
🏊 对象池IObjectPoolModule对象池管理TEngine
⏱️ 计时器IGameTimerModule游戏计时器⚡ 优化
🎲 内存池MemoryPool非托管内存池⚡ 优化
🎯 动画IAnimModule动画控制🆕 新增
🕹️ 输入IInputModule输入处理🆕 新增
🏊 GameObject 池IGameObjectPoolModuleGameObject 对象池🆕 新增

📁 项目结构

DGame/
├── GameConfig/              # 游戏配置(Luban)
├── GameRelease/             # 发布版本输出
├── GameUnity/               # Unity 主项目
│   ├── Assets/
│   │   ├── DGame/           # DGame 框架核心
│   │   │   ├── Editor/      # 🆕 编辑器工具(工具栏扩展、Spine 助手等)
│   │   │   └── Runtime/     # 框架运行时代码
│   │   │       ├── Core/    # 核心系统(日志、内存池、模块系统、事件)
│   │   │       └── Module/  # 功能模块(GameTimer、AnimModule、InputModule等)
│   │   └── Scripts/
│   │       ├── HotFix/      # 热更新代码
│   │       │   ├── GameBase/      # 基础框架程序集
│   │       │   ├── GameProto/     # 配置协议程序集
│   │       │   └── GameLogic/     # 业务逻辑程序集
│   │       │       ├── Module/    # 🆕 红点系统、数据中心、UI 系统等
│   │       │       ├── Common/    # 🆕 序列帧动画等
│   │       │       └── GMPanel/   # 🆕 GM 系统
│   │       └── Launcher/    # 启动器代码(AOT)
│   └── ...
├── Tools/                   # 开发工具
└── UnityPackage/            # Unity 包导出

💻 系统要求

项目要求
Unity 版本2021.3.30f1c1(推荐)或更高
开发环境.NET 4.x / .NET Standard 2.1
支持平台Windows、Android、iOS

📖 开发指南

计时器使用(⚡ 优化版)

var timer = GameTimer.CreateLoopGameTimer(1f, () => DLogger.Info("每秒执行"));
timer.LoopCount = 5;  // 只执行 5 次

红点系统使用(🆕 新增)

RedDotModule.Instance.SetState(RedDotPathDefine_Gen.Main_Bag_Equipment, true);
AddUIEvent(RedDotPathDefine_Gen.Main_Bag, OnRedDotChanged);

序列帧动画(🆕 新增)

var frameSprite = await FrameSpriteMgr.PlayAsync(transform, "EffectAtlas", spriteNameArray, 30, 1);

GM 命令(🆕 新增)

GMModule.ExecuteCommand("AddGold 1000");
GMModule.ExecuteClientGm(GmCommandId.AddGold);

存档系统(🆕 新增)

// 定义存档类
[ClientSaveData("Setting", PerRoleID = false)]
public class SettingSaveData : BaseClientSaveData
{
    public int MusicVolume = 50;
}

// 获取存档
var setting = ClientSaveDataMgr.Instance.GetSaveData<SettingSaveData>();
setting.MusicVolume = 80;
setting.Save();

// 批量保存
ClientSaveDataMgr.Instance.SaveAllClientData();

UI 开发

public class MyWindow : UIWindow
{
    private Button m_btnClose;

    protected override void ScriptGenerator()
    {
        m_btnClose = FindChildComponent<Button>("m_btnClose");
        m_btnClose.ClickProtect = true;
        m_btnClose.ClickScale = 0.9f;
    }
}

await UIModule.Instance.ShowWindowAsync<MyWindow>(userData);

🙏 致谢

本项目基于 TEngine 框架进行深度优化演进,感谢 TEngine 项目的优秀架构设计和核心功能实现。


🤝 开源协议

本项目采用 MIT License 开源协议。