# LockstepArcade-TEngine-Fantasy-Demo
**Repository Path**: M-QH/LockstepArcade-TEngine-Fantasy-Demo
## Basic Information
- **Project Name**: LockstepArcade-TEngine-Fantasy-Demo
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-04-17
- **Last Updated**: 2026-04-17
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Lockstep Arcade Fantasy Demo
### - **本项目是半成品,UI、格斗、网络系统都还不够完善,因为最近需要专注于其他项目,又不想这个 Demo 吃灰,就先开源此demo搏大家一笑。**
### - **本人没有帧同步和服务器开发经验,Demo 仅用于学习和技术验证,请谨慎使用和学习,以免被带入误区。**
### - **本项目有大量的 Vibe Coding,可能会有一些意想不到的 Bug,请谨慎使用。**
### - **后续可能会更新,后续更新不太可能。**
## 项目介绍
这是一个围绕“确定性仿真 + 服务端权威帧同步 + 客户端预测回滚”搭建的技术演示项目。
项目使用 Unity + TEngine 作为客户端壳层,Fantasy + KCP 作为服务端通信基础设施,并通过共享 `BattleCore` 的方式,让客户端与服务端运行同一套战斗规则代码,重点演示以下链路:
- 本地战斗与联机战斗共用同一套战斗核心
- 房间创建、入房、准备、开战的完整联机流程
- 客户端预测、权威帧对账、输入不一致回滚重演
- 基于定点数的确定性战斗仿真
- 回放录制与播放
这个仓库的目标不是商业成品模板,而是一个可以跑通、可阅读、可继续扩展的帧同步格斗 Demo。
## 文档快速预览
- [README](README.md):项目概览、启动方式、核心结构。
- [技术 Demo 架构说明](docs/architecture/TECH_DEMO_ARCHITECTURE.md):客户端壳层、共享 BattleCore、服务端权威层的完整说明。
## 为什么做这个 Demo
1. 不只演示本地 30 FPS 逻辑帧驱动,还把房间、联机开战、权威广播链路接了起来。
2. 不只做“状态同步”,而是明确采用输入驱动的帧同步思路,适合格斗游戏场景。
3. BattleCore 通过源码共享的方式同时服务客户端和服务端,方便验证规则一致性。
4. 项目结构尽量贴近真实工程拆分,适合作为学习 TEngine + Fantasy 双端协作的样例。
## 当前已实现能力
- `30 FPS` 确定性逻辑帧推进
- `60 FPS` 渲染插值显示
- `Fix64 / FixVector2 / FixVector3` 定点数仿真
- 本地双人战斗
- 登录、建房、入房、准备、开战
- 服务端权威帧推进与帧广播
- 客户端预测、回滚与状态哈希校验
- 轻攻击、重攻击、受击、防御、KO
- 回放录制与本地播放
## 快速启动
### 环境要求
- Windows
- Unity `2022.3.62f2`
- .NET SDK `9.x`
- 服务端默认监听:`127.0.0.1:20000`
### 1. 服务端相关
服务端部分这里不展开细说,这里的文档布局和使用方法与官方教程类似,建议直接参考 Fantasy 官方教程:
- [Fantasy 官方教程:创建您的第一个应用](https://www.code-fantasy.com/top/creating-your-app/)
### 2. 打开客户端
- 使用 Unity `2022.3.62f2` 打开 [Client/Unity](Client/Unity)
- 进入 Play Mode
### 3. 从首页选择入口
- `Home -> StartLocalBattle`
直接进入本地双人战斗
- `Home -> SetRoom`
登录、建房或入房、准备、开始联机战斗
- `Home -> ReplayLocalRecord`
播放最近一次本地录制
## 推荐验证流程
### 本地战斗验证
- 从 `Home -> StartLocalBattle` 进入
- 验证移动、跳跃、下蹲、防御、轻重攻击、受击、KO、回放
### 单人联网联调
- 启动服务端
- 进入 `Home -> SetRoom`
- 使用任意账号密码登录
- 创建房间
- 等待第二名玩家入房并双方 `Ready` 后开始战斗
### 双客户端联机验证
- 启动一个服务端
- 启动两个客户端
- 使用不同账号登录
- 一端建房,另一端入房
- 双方准备后开始战斗
## 项目结构概览
```text
.
├── BattleCore # 共享战斗核心工程,服务端引用同一套战斗源码
├── Client
│ └── Unity
│ └── Assets/GameScripts/HotFix/GameLogic
│ ├── Battle # 帧同步、输入、仿真、渲染、回放
│ ├── Deterministic # Fix64 / FixVector2 / FixVector3 / FixMath
│ ├── NetWork # Fantasy 客户端接入、协议与房间流程
│ ├── Procedure # Home / Lobby / Battle 流程切换
│ └── UI # 首页、Lobby、战斗 HUD、结算等界面
├── Config # 配置表资源
├── Server
│ ├── Main # 服务端入口
│ ├── Entity # 共享数据结构、协议、实体组件
│ └── Hotfix # 房间、战斗、消息处理逻辑
├── Tools # 启服脚本、协议导出工具等
└── docs # 架构说明文档
```
## 核心技术链路
```mermaid
flowchart LR
A["Home / Lobby UI"] --> B["FantasyManager"]
B --> C["Fantasy Session (KCP)"]
C --> D["Server Handler"]
D --> E["RoomManageComponentSystem"]
E --> F["BattleSession"]
F --> G["SimulationWorld (Authoritative)"]
E --> H["G2C_FrameCommand"]
H --> I["FrameRunner"]
I --> J["Predict / Rollback / Hash Check"]
J --> K["RenderInterpolator + BattleCoreUI"]
```
客户端负责 UI、流程、输入采样、预测与回滚触发;服务端负责房间、权威帧推进、输入接收窗口校验与帧广播;战斗规则则由客户端与服务端共享同一套 `BattleCore` 源码实现。
## BattleCore 设计重点
- `FrameRunner` 负责逻辑帧驱动、网络模式配置、回滚与重演
- `SimulationWorld` 负责组件管理、系统执行、快照保存、状态哈希
- 当前系统顺序为:
- `InputSystem`
- `JumpSystem`
- `MovementSystem`
- `CollisionSystem`
- `StateSystem`
- `CombatSystem`
- `RenderInterpolator` 负责 30 FPS 逻辑帧到 60 FPS 渲染的插值显示
- `ReplaySystem` 负责战斗录制与回放
## 确定性规则
帧同步战斗逻辑必须保持确定性,仿真层请始终遵守以下约束:
- 不要在仿真逻辑中使用 `float` / `double`
- 不要在仿真逻辑中直接使用 `UnityEngine.Vector3`
- 不要在仿真逻辑中依赖 `Time.deltaTime`
- 所有位置、速度、碰撞、伤害、状态持续时间统一使用定点数
- 客户端和服务端的战斗规则实现必须保持一致
## 协议与联机流程
当前已经接通的主要联机消息包括:
- `C2G_LoginRequest` / `G2C_LoginResponse`
- `C2G_CreateRoomRequest` / `G2C_CreateRoomResponse`
- `C2G_JoinRoomRequest` / `G2C_JoinRoomResponse`
- `C2G_LeaveRoomRequest` / `G2C_LeaveRoomResponse`
- `C2G_SetReadyRequest` / `G2C_SetReadyResponse`
- `C2G_StartBattleRequest` / `G2C_StartBattleResponse`
- `G2C_RoomSnapshot`
- `G2C_StartFrameSync`
- `C2G_NextFrameCommand`
- `G2C_FrameCommand`
联机主流程为:
`登录 -> 房间同步 -> Ready -> StartFrameSync -> 输入上传 -> 权威帧广播 -> 预测对账 -> 回滚重演`
## 依赖与版本
- [TEngine](https://github.com/ALEXTANGXIAO/TEngine) `6.0.0`:Unity 客户端框架
- [Fantasy.Unity](https://github.com/qq362946/Fantasy) `2025.2.1423`:客户端网络接入
- `Fantasy-Net`:服务端网络与实体框架,当前在 `Server/Entity/Entity.csproj` 中使用浮动版本引用
- [HybridCLR](https://github.com/focus-creative-games/hybridclr) `8.11.0`:热更新方案
- [YooAsset](https://github.com/tuyoogame/YooAsset) `2.3.17`:资源管理
- [UniTask](https://github.com/Cysharp/UniTask) `2.5.10`:异步任务方案
- `Newtonsoft.Json` `3.2.1`:Unity 侧 JSON 支持
- Luban:配置表生成工具,本仓库未锁定工具版本号
## 后续方向
- [ ] 完善UI:包括房间选择、设置、结算、对战中。
- [ ] 完善动画:下蹲动画、下蹲攻击动画等还不够全面。
- [ ] 完善网络功能:包括完善的房间系统、断线重连、断线等待、反作弊、下发录像等等。
- [ ] 完善格斗逻辑:立回、硬直、手感等问题。
- [ ] 完善一些基本逻辑:包括多语言、画面、设置、按键设置、手柄支持等。
- [ ] 继续完善客户端预测与全链路回滚体验
## 开源资源与致谢
- 定点数实现基于 `FixMath.NET` 相关代码与命名空间适配,用于客户端与服务端共享确定性仿真能力
- 帧动画资源使用了 Pixel Moon Studio 的素材:
[Male Realistic Pixel Art Template Sprite Pack](https://pixel-moon-studio.itch.io/male-realistic-pixel-art-template-sprite-pack)
- 感谢 TEngine、Fantasy、HybridCLR、YooAsset、UniTask 等开源项目提供的基础能力