DragonRider 是一个高保真第三人称动作 / 飞行游戏原型,基于 Unreal Engine 5.6。它不是只做“龙在飞”的演出,而是把三件最难的事情同时按工程标准串起来:同步多人环境、ESP32 实体控制器,以及 Gameplay Ability System(GAS)驱动的战斗。
玩家同时控制两个存在:
- 龙:由两枚 MPU6050 感知倾角和加速度,用身体动作控制速度与方向。
- 骑手:用拇指摇杆移动,用压力传感器触发动作。
这让“骑龙”从按键抽象变成了真正需要身体参与的体验。

关键词
- Alt-Control:ESP32 + 双 MPU6050 + 摇杆 + 压力传感器,115200 波特率串流
- GAS:玩家和敌人都挂载 AbilitySystemComponent,属性用 AttributeSet 复制
- 物理飞行:
UDragonBounceComponent做速度反射,碰撞像弹性体而不是硬停 - 多人同步:网络复制的属性和状态,团队 ID 识别敌我
- **模块化 C++**:输入、运动、战斗拆成独立组件,方便并行开发和新人 onboarding
实体控制器怎么工作
控制器不是简单的“一个按钮触发一个动作”。它是一块 ESP32,把多种物理输入融合成 19 字节的二进制包,每 10ms 通过 UART Serial 发一次:
| Offset | 类型 | 字段 | 含义 |
|---|---|---|---|
| 0 | uint8 | Header 1 | 固定 0xAA |
| 1 | uint8 | Header 2 | 固定 0xBB |
| 2 | float | Dragon Speed | 0.0–1.0 归一化力度 |
| 6 | float | Dragon Dir | -1.0–1.0 归一化倾角 |
| 10 | float | Rider X | -1.0–1.0 |
| 14 | float | Rider Y | -1.0–1.0 |
| 18 | uint8 | Events | 位掩码动作 |
硬件映射上:
MPU6050 #1(地址0x68)作为“龙翼传感器”,用总加速度决定速度:低于10.5g不动,最高到30.0g。MPU6050 #2(地址0x69)作为“身体传感器”,用 Roll 角控制方向,最大 ±30° 映射到 ±1.0。- 骑手摇杆用
A0 / A1 / D10,Y 轴在固件里反相。 - 压力传感器接
A2,超过阈值时置位EVENT_BIT_RIGHT_ROPE。
开机时固件会做 500 次采样校准陀螺仪零点;如果两块 MPU 都没找到,LED 会一直闪,明确拒绝进入“能跑但输入是错”的状态。
Unreal 侧的桥接
UE5 通过 UAltControlClientComponent 用高频 HTTP polling(默认 100Hz)从本地地址拉取二进制包,解析成 FAltGamePacket:
DragonSpeed/DragonDirection驱动龙的飞行输入RiderDirectionX/Y驱动骑手移动ActionEvents映射到具体玩法动作
输入进入 Unreal 后,BP_ThirdPersonCharacter_Keyboard 监听 OnPacketUpdated,用 FInterp To 对 Yaw / Pitch / Roll 做平滑,避免原始传感器噪声让龙“抽搐”。
龙不是“飞机”,是有弹性的身体
UDragonBounceComponent 负责飞行中撞到地形时的响应。它做的是速度反射,而不是简单停止:
BounceStrength控制碰撞后的弹性MinImpactSpeed是抑制阈值:低速擦碰不会被误判成“撞墙”- 碰撞后通过
LaunchCharacter施加反射速度
这样高速俯冲擦过岩壁时,龙会顺着几何体弹开,而不是像砖块一样卡住。工程文档里特别提到“Fixed dragon bounce jitter on low-speed impacts”,说明低速抖动是被专门压掉的。
GAS 战斗结构
玩家和敌人都不靠临时 if-else 堆战斗。项目用 GAS 管理属性、效果和能力:
AGASDragonCharacterBase:实现IAbilitySystemInterface,初始化 ASC 和UGASBaseAttributeSetUGASBaseAttributeSet:Health / MaxHealth / Energy / MaxEnergy / Gold,通过 RepNotify 网络复制AEnemyBase:管理Patrol / ChaseAI 状态、死亡逻辑和 GAS 初始化UEnemyAttributeSet:敌人的Health和AttackPower
能力层用 Blueprint 组合,例如:
GA_Boss_ArcaneBarrage:PlayMontageAndWait + GEGA_Boss_ArcaneBombardment:随机 AOE 落点GA_Boss_FocusedBeam:tick 型射线检测,周期性施加伤害GA_Boss_HomingOrb:生成追踪弹
数值与状态都从 Blueprint 里抽到 GameplayEffect:
GE_Dmg_Boss_*:Boss 瞬时伤害GE_InitBoss / GE_InitPlayer:生成时初始化属性GE_SwitchStatus:用 Gameplay Tag 管理二阶段和无敌状态
多人同步
这是一个“同步 co-op”原型,而不是只在本机运行:
- 属性通过 RepNotify 复制
- 输入、移动和战斗分层,减少同步耦合
- 敌我识别走 Generic Team ID,而不是硬编码阵营
技术栈
- Unreal Engine 5.6
- C++ / Blueprint
- Gameplay Ability System + GameplayEffects
- ESP32 / MPU6050 / Joystick / Pressure Sensor
- UART Serial 115200 / HTTP polling
- Perforce 版本控制
链接
- 项目技术文档与 OneSheet 来自本地课程项目文档目录。