# FinalCore **Repository Path**: CodeInYNOU/final-core ## Basic Information - **Project Name**: FinalCore - **Description**: 关于FinalFrameWork的包管理版本 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-04-10 - **Last Updated**: 2026-10-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ![FFW](http://pic.fasty97.top/fasty26/202602082038998.png) # FinalFrameWork (FFW) > FinalFrameWork 是一个通用 Unity 游戏框架,包含多项常用功能。现代、简单、强大,为您的游戏开发提速。 **包名**:`com.fasty.finalframe` | **版本**:v1.0.0 | **IOC**:v2.2 | **Unity**:2020.3+ | **作者**:[Fasty](https://fasty97.top) 详情请看博客:[FinalFrameWork 使用手册](https://www.fasty97.top/2026/02/02/FinalFrameWork%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C/) --- ## 目录 - [特性概览](#特性概览) - [整体架构](#整体架构) - [目录结构](#目录结构) - [核心模块 Core](#核心模块-core) - [基础系统 BaseSystems](#基础系统-basesystems) - [扩展模块 Extension](#扩展模块-extension) - [模板系统 Template](#模板系统-template) - [工具集 Tools](#工具集-tools) - [编辑器扩展 Editor](#编辑器扩展-editor) - [第三方依赖](#第三方依赖) - [安装方式](#安装方式) - [快速开始](#快速开始) - [版本历史](#版本历史) - [许可证](#许可证) --- ## 特性概览 | 能力 | 说明 | |------|------| | IOC 容器 | 轻量级依赖注入容器,统一管理系统与模型的生命周期 | | 事件系统 | 弱引用事件中心,支持结构体事件、可注销,避免 GC | | UI 系统 | 面板/弹窗/Toast 分层管理,DOTween 动画,栈式管理 | | 资源系统 | 基于 Addressables 的资源加载,可扩展自定义加载器 | | 存档系统 | AES 加密存档 + Nino 二进制序列化 + DataDomain 域式存档 | | 音乐音效 | BGM/音效池化管理,运行时可调音量与静音 | | 画质系统 | 完整画质调节(抗锯齿/阴影/分辨率/后处理/帧率等) | | 输入系统 | 可拔插输入抽象,统一传统 Input 与 InputSystem 包,业务零侵入切换 | | 状态机 | 标准 FSM + 下推自动机(PushDown),支持泛型上下文 | | 对象池 | 泛型对象池管理器,支持预制体池 | | 配置工具 | CSV ↔ So 双向转换,支持特性映射的流式解析 | | 本地化 | 多语言文本系统 | | 成就/Buff/热键 | 可复用的游戏玩法模板 | | 调试窗口 | 六页签运行时调试器(IOC/事件/UI/存档/音乐/画质) | | 打包工具 | 一站式 Addressables 分组 + 多平台构建 | --- ## 整体架构 FFW 采用**六层分层架构**,自顶向下依赖: ``` ┌─────────────────────────────────────────────────┐ │ L1 入口层 GameStartAbs / GameStartFsm │ MonoBehaviour 启动器,Awake 初始化 ├─────────────────────────────────────────────────┤ │ L2 核心层 GameCore (IOC v2.2) │ 依赖注入容器,统一注册/获取/注销 ├─────────────────────────────────────────────────┤ │ L3 基础系统 EventKit / SaveKit / UiKit / │ 事件、存档、UI、音乐、画质、资源、 │ MusicKit / QualityKit / ResKit / │ 场景、Mono、DataDomain 九大系统 │ SceneKit / MonoKit / DataDomain │ ├─────────────────────────────────────────────────┤ │ L4 扩展层 ObjectPool / FFSM / Csv2So / │ 对象池、状态机、CSV 工具、单例 │ CsvParser / Singleton │ ├─────────────────────────────────────────────────┤ │ L5 模板层 AchievementKit / BuffKit / │ 成就、Buff、热键、本地化、存档V2 │ HotKeyKit / Localization / SaveV2 │ ├─────────────────────────────────────────────────┤ │ L6 插件层 DOTween / UniRx / UniTask / │ 第三方基础库 │ EnhancedScroller │ └─────────────────────────────────────────────────┘ ``` **核心设计理念**: - **IOC 驱动**:所有系统/模型通过 `GameCore` 容器注册获取,完全解耦,无硬编码单例 - **抽象启动器**:`GameStartAbs` 定义启动流程模板,资源/场景加载器由子类决定 - **事件驱动**:`OnRegistryChanged` 事件通知调试工具,避免轮询 - **弱引用事件**:EventCenter 使用弱引用持有监听者,防止内存泄漏 - **异步优先**:基于 UniTask 的零 GC 异步操作,深度集成 Addressables --- ## 目录结构 ``` final-core/ ├── Runtime/ # 运行时代码 │ └── FFW/ │ ├── Core/ # 核心层:IOC容器、启动器、Model、状态 │ ├── BaseSystems/ # 基础系统:9 大 Kit │ ├── Extension/ # 扩展:CSV、FSM、对象池、单例 │ ├── Template/ # 模板:成就、Buff、热键、本地化、存档V2 │ └── Tools/ # 工具:日志、颜色、富文本、任务队列等 ├── Editor/ # 编辑器扩展 │ ├── FFW/ # 调试窗口(IOC/事件/UI/存档/音乐/画质) │ └── Packer/ # 打包器(Addressables分组 + 多平台构建) ├── Plugins/ # 第三方插件(DOTween/UniRx/UniTask/EnhancedScroller) ├── Resources/ # 运行时资源(配置资产、UI预制体) ├── package.json # UPM 包定义 ├── CHANGELOG.md # 版本变更记录 └── LICENSE.md # 许可证 ``` --- ## 核心模块 Core 路径:`Runtime/FFW/Core/` ### GameCore — IOC 容器 (v2.2) 静态依赖注入容器,框架的中枢枢纽。内部维护三个字典: | 字典 | 类型 | 作用 | |------|------|------| | `_registry` | `Dictionary` | 按类型注册的实例容器 | | `_interfaceMap` | `Dictionary` | 接口到实现类型的映射表 | | `_namedRegistry` | `Dictionary<(Type, string), object>` | 按类型+名称注册的命名实例容器 | **核心 API**: ```csharp // 注册 GameCore.Register(new MySystem()); // 类型注册 GameCore.Register("remote", loader); // 命名注册 GameCore.MapInterface(); // 接口映射 // 获取(查找链:类型注册 → 接口映射 → 接口遍历惰性绑定) var sys = GameCore.Get(); var loader = GameCore.TryGet(); // 不存在返回 null // 生命周期 GameCore.Unregister(); // 注销(自动调用 CloseSystem) GameCore.ShutDown(); // 关闭所有系统并清空容器 GameCore.Dump(); // 输出诊断信息 ``` **设计特点**: - 注册 `ModelAbs` 时自动调用 `OnInitialize()` - 注销 `ISystemOpenClose` 时自动调用 `CloseSystem()` - `Get()` 支持接口惰性绑定:首次查找时遍历注册表并缓存映射 - `OnRegistryChanged` 事件驱动调试工具实时刷新 - 兼容层提供 `RegisterSystem()` / `GetSystem()` / `RegisterModel()` 语义化别名 ### GameStartAbs — 抽象启动器 继承 `MonoBehaviour`,定义游戏启动的标准流程模板: **启动流程(Awake 阶段)**: 1. 创建 `GameBlackboard` 并注册为 Model 2. 注册 `PoolManager`(对象池系统) 3. 注册 `EventCenter`(事件中心) 4. 注册资源加载器 `IResLoader`(抽象属性,子类决定)并 `OpenSystem()` 5. 注册 `UISystem`(传入资源加载器) 6. 注册 `MusicSystem` / `MonoSystem` / `SceneLoaderSystem` 7. 读取 `StreamingAssets/Config/packer.json` 版本信息 8. 打开 `MusicSystem`,初始化 `SaveSystem`(配置加密选项) **抽象点**(子类必须实现): - `ResLoader`:资源加载方案(Addressables / Resources) - `SceneLoader`:场景加载方案 - `UsePass` / `PassStr`:存档加密配置(可覆盖) **销毁**:`OnDestroy()` 调用 `GameCore.ShutDown()` 清理所有系统。 ### GameStartFsm — FSM 启动器示例 继承 `GameStartAbs`,演示带状态机的启动流程: - 使用 `AddressResLoader` + `SceneLoaderDefault` - 创建 `FsmMachine`,添加 `MenuGameState` / `PlayGameState` - 状态通过 `GameCore.GetSystem()` 直接操作 UI 面板 ### Model 架构 | 类 | 说明 | |----|------| | `ModelAbs` | 模型抽象基类,仅定义 `abstract void OnInitialize()`,注册时自动调用 | | `BlackboardAbs` | 抽象黑板,内部 `Dictionary`,提供泛型键值对存取 | | `GameBlackboard` | 全局黑板,继承 `BlackboardAbs`,作为游戏数据扩展点 | ### GameCoreDebugView 继承 `MonoBehaviour` 的标记组件,配合 Editor 脚本在 Play 模式下实时显示 IOC 容器状态。 --- ## 基础系统 BaseSystems 路径:`Runtime/FFW/BaseSystems/` ### ISystem 接口体系 | 接口 | 说明 | |------|------| | `ISystem` | 系统标记接口,注册到 IOC 容器 | | `ISystemOpenClose` | 可开关系统,提供 `OpenSystem()` / `CloseSystem()` 生命周期 | ### EventKit — 事件中心 弱引用事件系统,推荐使用结构体事件避免 GC。 - `EventCenter`:全局事件中心,注册到 GameCore - 统一增加 `IEvent` 约束 - 支持事件注销,弱引用持有监听者防止内存泄漏 - 调试窗口可实时查看事件名、监听者数量及详情 ### UiKit — UI 系统 面板/弹窗/Toast 分层管理,栈式管理。 | 类 | 说明 | |----|------| | `UISystem` | UI 系统主类,管理面板栈与弹窗栈 | | `UIPanelBase` | 面板基类,常驻 UI | | `PopWindowAbs` | 弹窗基类,支持 DOTween 动画、拖拽、置顶 | | `UIAnimation` | UI 动画组件,基于 DOTween 缓动 | | `centerTip` | 屏幕中央 Toast 提示 | - 加载方式:通过 `IResLoader` 异步加载 Prefab - 动画系统:依赖 DOTween,弹窗支持进出场动画 - 调试:`GetUIStackStateInfo()` 返回栈状态文本 ### ResKit — 资源系统 基于 Addressables 的资源加载,可扩展。 - `IResLoader`:资源加载器抽象接口 - `AddressResLoader`:默认实现,基于 Addressables - 子类可扩展 Resources 等方案 ### SaveKit — 存档系统 支持多种存储格式的存档系统。 - `SaveSystem`:存档系统 V1,AES 加密(默认密码 `Fasty97`) - 最多 10 个存档栏位 - 支持注册多个存档对象 - 调试窗口可查看存档目录、加密状态、栏位状态 ### DataDomain — 域式存档 V2 新版域式存档系统。 - `SaveManager`:域式存档管理器 - `GetDomainDebugSnapshots()`:返回域数据快照(JSON) - 支持异步保存/加载 - 调试窗口页签 5 专门用于此系统 ### MusicKit — 音乐音效系统 BGM/音效池化管理。 - `MusicSystem`:音乐系统主类 - `MusicConfigAsset`:配置资产(音量/静音),位于 Resources - BGM 单源播放,音效通过 AudioSource 池复用 - 运行时可调总音量/BGM 音量/音效音量及静音 - 调试窗口通过反射访问私有字段获取内部状态 ### QualityKit — 画质系统 完整画质调节。 - `QualitySystem`:画质系统主类 - `QualityConfigAsset`:配置资产,位于 Resources - `QualityApplier`:画质应用器 - 支持:画质等级、分辨率缩放、抗锯齿、LOD 偏移、阴影、纹理质量、后处理、Bloom、VSync、帧率上限、分辨率、全屏模式 - 调试窗口页签 4 提供完整画质调节面板 ### SceneKit — 场景系统 - `SceneLoaderSystem`:场景加载系统 - `ISceneLoader`:场景加载器抽象接口 - `SceneLoaderDefault`:默认实现 ### MonoKit — Mono 管理 - `MonoSystem`:为非 MonoBehaviour 类提供 Update/协程能力 ### InputKit — 输入系统(可拔插) 可拔插输入系统,统一封装传统 `UnityEngine.Input` 与 Unity `InputSystem` 包,业务层零侵入切换。 | 类/接口 | 说明 | |---------|------| | `InputSystem` | FFW 输入主类(IOC 系统),统一入口,转发查询与事件订阅 | | `IInputProvider` | 输入查询抽象接口(可拔插核心) | | `LegacyInputProvider` | 基于 `UnityEngine.Input` 的零依赖实现 | | `InputSystemProvider` | 基于 InputSystem 包的实现(条件编译 `FFW_INPUTSYSTEM`) | | `IRebindProvider` | 按键重映射可选接口(类似 `IHapticsProvider`),Provider 按需实现 | | `InputEventBus` | 轮询式事件总线,仅检测有订阅的动作 | | `InputConfigAsset` | 配置资产(actionName → KeyCode 映射) | | `InputContext` | 只读 struct 事件上下文(零 GC) | **可拔插机制**: - InputSystem 包为**可选依赖**,未安装时框架正常编译运行 - asmdef `versionDefines`:安装 `com.unity.inputsystem` 自动定义 `FFW_INPUTSYSTEM` 宏 - `GameStartAbs` 新增 `InputProvider` 抽象属性,子类决定具体实现 - 无 `InputActionAsset` 时自动降级到 `LegacyInputProvider`(传统 Input) **使用方式**: ```csharp // 启动器中指定 Provider protected override IInputProvider InputProvider => InputSystem.CreateUnityInputSystemProvider() ?? new LegacyInputProvider(); // 查询输入 var input = GameCore.Get(); if (input.GetButtonDown("Jump")) { /* 跳跃 */ } // 订阅事件 input.OnDown("Jump", ctx => Debug.Log("跳跃")); ``` **按键重映射(Rebinding)**: `InputSystem.Rebind` 属性返回 `IRebindProvider`(不支持时为 null),与 `Haptics` 同模式。 ```csharp var rebind = GameCore.Get()?.Rebind; if (rebind != null) { // 加载已保存的按键 rebind.LoadBindings(); // 获取动作列表 var actions = rebind.GetActionNames(); // 改键 — 等待用户按键(5秒超时) bool success = await rebind.RebindAsync("Jump", timeout: 5f); // 获取按键显示文本 string text = rebind.GetBindingText("Jump"); // "Space", "F"... // 保存到 PlayerPrefs rebind.SaveBindings(); // 重置所有按键 rebind.ResetAllBindings(); // 监听按键变更 rebind.OnBindingChanged += (action, newText) => { /* 更新 UI */ }; } ``` 各 Provider 实现: | Provider | 改键方式 | 持久化 | |----------|---------|--------| | `InputSystemProvider` | `PerformInteractiveRebinding`(原生改键 UI 流程) | `SaveBindingOverridesAsJson` → PlayerPrefs | | `LegacyInputProvider` | 轮询 `Input.GetKeyDown` 捕获首键 | `JsonUtility` 序列化 `action → KeyCode` → PlayerPrefs | 示例脚本:`Runtime/FFW/Template/RebindKit/RebindTest.cs`(挂载即可使用)。 --- ## 扩展模块 Extension 路径:`Runtime/FFW/Extension/` ### Csv2So — CSV 转 So 工具 仅编辑器使用,将 CSV 配置文件自动生成为 C# 实体类和 ScriptableObject 资产。 - 菜单:`Assets/CSV工具/创建实体类和SO` - CSV 格式:第1行标题(中文)、第2行字段名(英文)、第3行类型、第4行起数据 - 生成实体类(`[System.Serializable]`,含 `ToCsvString()`) - 生成 Database 类(继承 `ScriptableObject`,含 Odin `[Button]` 回写 CSV) ### CsvParser — 运行时 CSV 解析器 支持特性映射的 CSV 解析,提供同步/异步/流式多种模式。 - `[CSVColumn("列名")]`:标注字段映射 - `CSVParser.Parse(csvContent)`:同步解析 - `CSVParser.ParseStreamAsync(path, ct)`:异步流式解析(`IAsyncEnumerable`),适合大文件 - 支持类型:string/int/float/double/bool/Vector2/Vector3/Color/枚举/自定义 Parse ### FFSM — 有限状态机 提供标准 FSM 和下推自动机两种实现。 | 类 | 说明 | |----|------| | `FsmStateAbs` | 状态抽象基类,`Enter()` / `Exit()` / `Update()` | | `FsmReturnStateAbs` | 带返回值状态,`Execute()` 返回 `UniTask` | | `FsmTransition` | 状态转换,`Func` 条件 + 目标状态 | | `FsmMachine` | 标准有限状态机,链式添加状态/转换 | | `PushDownFsmMachine` | 下推自动机,`PushState()` / `PopState()`,适合暂停菜单 | - 支持泛型上下文 - 防止递归状态转换 - 缓存当前状态转换条件提高检测效率 - `OnStateChangeAction` 状态变化回调 ### ObjectPool — 对象池 - `PoolManager`:对象池管理器,注册到 GameCore - 泛型对象池,支持预制体池 - 调试窗口可查看池使用率、空闲/使用数量、容量等 ### Singleton — 单例 通用单例基类,提供 MonoBehaviour 单例与纯 C# 单例实现。 --- ## 模板系统 Template 路径:`Runtime/FFW/Template/` ### AchievementKit — 成就系统 - 成就存储与触发 - 可复用的成就模板 ### BuffKit — Buff 系统 将每种行为抽象为 `ActionAsset`,多个 ActionAsset 组合成 `BuffAsset`,执行 Buff 即周期性执行 ActionAsset。 - 适用于回合制卡牌(行为抽象)与实时游戏(如 PvZ 僵尸部件) - 与数值系统结合(血量/攻击力/防御力) ### HotKeyKit — 热键系统 - 传统热键系统 - 支持自定义热键绑定 ### Localization — 多语言 - 多语言文本系统 - 配置器驱动 ### SaveSystemV2 — 存档系统 V2 新版存档系统,配合 DataDomain 使用。 --- ## 工具集 Tools 路径:`Runtime/FFW/Tools/` | 工具类 | 说明 | |--------|------| | `Dict.cs` | 字典工具扩展 | | `FastyColor.cs` | 控制台彩色日志颜色定义(Red/Yellow/GreenB/BlueB 等) | | `FastyTool.cs` | 通用工具集 | | `MyLog.cs` | 自定义日志封装 | | `RichTextTool.cs` | 富文本工具 | | `SkipUnityLogo.cs` | 跳过 Unity 启动 Logo | | `TaskQueue.cs` | 任务队列,顺序执行异步任务 | --- ## 编辑器扩展 Editor 路径:`Editor/` ### GameCoreDebugWindow — 调试窗口 菜单:`Window/FFW/GameCore Debugger`,基于 UI Toolkit 的六页签运行时调试中心。 | 页签 | 名称 | 功能 | |------|------|------| | 0 | IOC 容器 | 类型注册、接口映射、命名注册,`OnRegistryChanged` 事件驱动刷新 | | 1 | 运行时状态 | 事件注册(监听者详情)、UI 栈状态、对象池状态(使用率比例条) | | 2 | 存档状态 | 存档目录、加密状态、已注册对象、10 个栏位状态 | | 3 | 音乐音效 | BGM 状态、音效池、音量 Slider、静音 Toggle、操作按钮 | | 4 | 画质控制 | 档位切换、画质/分辨率/抗锯齿/阴影/纹理/帧率 Slider、后处理 Toggle | | 5 | 存档 V2 | DataDomain 域快照、保存/加载/复制 JSON 按钮 | **刷新策略**:IOC 数据事件驱动,运行时数据 1 秒定时刷新。 ### GameCoreDebugViewEditor 为 `GameCoreDebugView` 组件提供 Inspector 面板,0.5 秒间隔显示 IOC 容器状态。 ### Packer — 打包器 菜单:`FFW/Packer`(Ctrl+L),基于 UI Toolkit 的一站式打包工具。 **页签一:UI 配置** - UI 文件夹配置:扫描目录,自动创建 `UIPanels` / `UIPopWindows` / `Fonts` 三个 Addressable Group - 项目资源结构:一键创建 `AARes/{Audio, Bgm, Assets/Prefabs}` 标准目录,扫描音频/预制体创建分组 - UI 模板创建:输入名称一键创建 UI Panel 或 PopWindow 完整目录结构(从模板预制体复制) **页签二:打包配置** - 版本管理:三段式 `A.B.C` 版本号,支持进位 - 构建配置:产品名、Debug/Release、平台(PC/Android/iOS)、输出目录、压缩模式、显示模式、分辨率 - 图标设置:PNG 图标自动设置各平台默认图标 - 构建流程:同步 PlayerSettings → Addressables 打包 → `BuildPipeline.BuildPlayer` → 打开输出目录 - 配置持久化:`PackModel` 序列化为 JSON,保存于 `StreamingAssets/Config/packer.json` ### AddressableGroupSetter Addressables 分组管理工具,程序化创建 Group、设置 Schema、批量添加资源条目。默认 Local 路径、LZ4 压缩、PackSeparately 模式。 ### UI 模板预制体 | 预制体 | 说明 | |--------|------| | `TemplatePanel.prefab` | UI Panel 模板:Image 背景 + CanvasGroup + TMP 文本 | | `TemplatePopWindow.prefab` | PopWindow 模板:含关闭按钮 + UIAnimation + Dragger + PopWindow 组件 | --- ## 第三方依赖 ### 必需依赖(package.json) | 依赖 | 版本 | 用途 | |------|------|------| | `com.unity.textmeshpro` | 1.0.0 | UI 文本渲染 | | `com.unity.nuget.newtonsoft-json` | 2.0.0 | JSON 序列化(DataDomain 快照等) | | `com.unity.addressables` | 1.21.21 | 资源管理基石 | ### 内置插件(Plugins 目录) | 插件 | 开发者 | 用途 | |------|--------|------| | **DOTween (Pro)** | Demigiant | 动画补间引擎,UI 动画系统基础依赖,Pro 版含可视化动画与路径编辑 | | **EnhancedScroller v2** | 商业插件 | 高性能虚拟化滚动列表,含 17 个 Demo,用于背包/排行榜等大量数据列表 | | **UniRx** | neuecc | 响应式编程扩展,事件流式处理与数据绑定 | | **UniTask** | Cysharp | 零 GC 异步库,框架异步操作核心,深度集成 Addressables | ### 可选依赖 | 依赖 | 用途 | 说明 | |------|------|------| | `com.unity.inputsystem` | 新版输入系统 | 安装后自动定义 `FFW_INPUTSYSTEM` 宏并启用 `InputSystemProvider`,未安装则使用传统 `LegacyInputProvider` | --- ## 安装方式 ### 通过 UPM(包管理器) 在 Unity 项目中打开 `Package Manager` → `Add package from git URL`,输入仓库地址即可。 或手动在 `Packages/manifest.json` 中添加: ```json { "dependencies": { "com.fasty.finalframe": "https://.git" } } ``` ### 依赖要求 - Unity 2020.3 或更高版本 - 自动引入 TextMeshPro、Newtonsoft.Json、Addressables --- ## 快速开始 ### 1. 创建游戏启动器 继承 `GameStartAbs` 实现抽象属性,或直接使用 `GameStartFsm`: ```csharp using FFW.Core; public class MyGameStart : GameStartAbs { protected override IResLoader ResLoader => new AddressResLoader(); protected override ISceneLoader SceneLoader => new SceneLoaderDefault(); protected override bool UsePass => true; // 启用存档加密 protected override string PassStr => "MyPassword"; // 自定义密码 } ``` 将脚本挂载到场景的 GameObject 上,启动游戏即自动完成所有系统初始化。 ### 2. 注册与获取系统 ```csharp // 注册自定义系统 GameCore.RegisterSystem(new MyCustomSystem()); // 获取系统 var ui = GameCore.GetSystem(); var music = GameCore.GetSystem(); ``` ### 3. 使用 UI 系统 ```csharp var ui = GameCore.GetSystem(); ui.ShowPanel(); // 显示面板 ui.ShowPop(); // 显示弹窗 ``` ### 4. 使用事件系统 ```csharp public struct PlayerDieEvent : IEvent { public int PlayerId; } var evt = GameCore.GetSystem(); evt.AddListener(OnPlayerDie); evt.Trigger(new PlayerDieEvent { PlayerId = 1 }); evt.RemoveListener(OnPlayerDie); ``` ### 5. 使用状态机 ```csharp var fsm = new FsmMachine(blackboard); fsm.AddState(new MenuState()) .AddState(new PlayState()) .AddTransition(new FsmTransition( () => Input.GetKeyDown(KeyCode.Space), playState, menuState)); fsm.ChangeState(); ``` ### 6. 打开调试窗口 Play 模式下菜单 `Window/FFW/GameCore Debugger` 打开六页签调试器。 ### 7. 使用打包工具 菜单 `FFW/Packer`(Ctrl+L)打开打包器,配置 UI 分组与构建参数后一键打包。 --- ## 版本历史 详细变更记录见 [CHANGELOG.md](./CHANGELOG.md)。 **当前版本 V0.0.5(1.0.0)**:配置器、多语言文本、事件系统 IEvent 约束、结构体事件优化 **开发中 V0.0.6(2.0.0)**:第三人称控制系统、Timeline 技能系统 --- ## 许可证 详见 [LICENSE.md](./LICENSE.md)。 --- ## 相关链接 - 博客:[FinalFrameWork 使用手册](https://www.fasty97.top/2026/02/02/FinalFrameWork%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C/) - 作者:[Fasty](https://fasty97.top) | Email:fasty97@126.com