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 和 UGASBaseAttributeSet
  • UGASBaseAttributeSetHealth / MaxHealth / Energy / MaxEnergy / Gold,通过 RepNotify 网络复制
  • AEnemyBase:管理 Patrol / Chase AI 状态、死亡逻辑和 GAS 初始化
  • UEnemyAttributeSet:敌人的 HealthAttackPower

能力层用 Blueprint 组合,例如:

  • GA_Boss_ArcaneBarragePlayMontageAndWait + GE
  • GA_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 来自本地课程项目文档目录。