12 KiB
UE5 客户端手动操作指南
本指南对应
ue_client/目录下已生成的所有代码和配置。
代码已写好,你只需要做编辑器里的点击操作。
遇到红色错误先看文末"常见问题"章节。
前置条件
| 软件 | 版本 | 下载地址 |
|---|---|---|
| Unreal Engine | 5.3 | Epic Games Launcher → Library → 5.3 |
| Cesium for Unreal | 最新 | 直接在下一步从 Marketplace 安装 |
| Visual Studio | 2022 Community | visualstudio.microsoft.com(安装 C++ 游戏开发工作负载) |
注意:Cesium for Unreal 必须先安装,否则代码会编译失败。
第一阶段(Phase A):本地演示版(不需要后端)
步骤 1:安装 Cesium for Unreal
- 打开 Epic Games Launcher
- 顶部切换到 Unreal Engine 选项卡
- 左侧点击 Fab(原 Marketplace,已改名)→ 搜索
Cesium for Unreal - 点击 免费获取(Free),然后点击 安装到引擎 → 选择 5.3
- 等待安装完成
步骤 2:打开项目
- 打开 Epic Games Launcher → Unreal Engine → Library
- 找到 5.3,点击右侧 Launch 旁边的下拉箭头 → Browse
- 导航到
planet/ue_client/,选择PlanetClient.uproject,点击打开 - UE 会提示"缺少模块,需要重新编译" → 点击 Yes
- 等待编译完成(首次约 5-10 分钟)
如果编译报错:见文末"常见问题 → 编译错误"
步骤 3:创建新关卡
- 菜单栏 → File → New Level
- 选择 Empty Level(空关卡)
- 保存:File → Save Current Level As
路径:Content/Maps/,名称:EarthMap - 点击 Save
步骤 4:添加 Cesium 地球
- 顶部菜单栏 → Cesium(如果没有此菜单,说明插件未激活:Edit → Plugins → 搜索 Cesium → 勾选 Enable → 重启)
- 在 Cesium 面板里点击 Add Blank 3D Tiles Tileset — 这会自动在场景里添加:
CesiumGeoreferenceActorCesium3DTilesetActor(地球瓦片)
- 再点击 Add Cesium ion Bing Maps Aerial 添加卫星影像底图(需要免费 Cesium ion 账号)
如果没有 Cesium ion 账号:Cesium 菜单 → Connect to Cesium ion → 注册免费账号
步骤 5:添加相机 Pawn
- 菜单栏 → Cesium → 找到 Dynamic Pawn(名称可能是
CesiumFlyToComponent相关的 Blueprint)
或者:Content Browser → 顶部搜索框输入DynamicPawn→ 找到插件内容里的DynamicPawn→ 拖入场景 - 在 Outliner 面板里点击刚拖入的
DynamicPawn - 在 Details 面板里,找到 Auto Possess Player → 改为 Player 0
这样游戏启动时摄像机会自动使用这个可飞行的地球相机。
步骤 6:配置 GameMode
- 菜单栏 → Window → World Settings(如果没有,也可以在 Details Panel 里找)
- 在 World Settings 面板里找到 Game Mode Override
- 点击下拉框 → 搜索
PlanetGameMode→ 选择它 - 找到 Default Pawn Class → 改为上一步拖入的
DynamicPawn
步骤 7:创建 ComputePoint Blueprint
这步把我写的 C++ 类包装成可以在编辑器里配置材质的 Blueprint。
- Content Browser → 空白处右键 → Blueprint Class
- 搜索父类:输入
ComputePointActor→ 找到AComputePointActor→ 点击 Select - 命名为
BP_ComputePointActor,保存到Content/Blueprints/
配置 BP_ComputePointActor 的网格和材质:
- 双击打开
BP_ComputePointActor - 在左侧 Components 面板里点击
SphereMesh - 在右侧 Details 面板里找到 Static Mesh → 点击下拉 → 搜索
Sphere→ 选择 Engine/BasicShapes/Sphere - 找到 Material → 点击下拉 → 搜索
M_Basic_Wall或者创建新材质(见下方)
创建三种状态的材质(颜色点即可):
-
Content Browser → 右键 → Material → 命名
M_PointNormal- 双击打开 → 右键空白区域 → 搜索
Constant3Vector→ 连接到Base Color - 颜色设为橙色:
(1.0, 0.4, 0.0) - 保存
- 双击打开 → 右键空白区域 → 搜索
-
同样方式创建
M_PointHovered(颜色白色1,1,1)和M_PointSelected(颜色青色0,1,1)
回到 BP_ComputePointActor:
- 在 Details 面板里:
- Normal Material → 选
M_PointNormal - Hovered Material → 选
M_PointHovered - Selected Material → 选
M_PointSelected - Point Scale →
80000(根据实际效果调整)
- Normal Material → 选
- 点击左上角 Compile → Save
步骤 8:放置 DataManager 并配置
- Content Browser → 右键 → Blueprint Class → 父类搜索
PlanetDataManager→ 选择APlanetDataManager - 命名为
BP_PlanetDataManager,保存到Content/Blueprints/ - 将
BP_PlanetDataManager拖入场景(Outliner 里会出现它) - 在 Outliner 里点击它 → 在 Details 面板里配置:
- Use Local Mock Data → ✅ 勾选(Phase A 不需要后端)
- Mock Data Path → 留空(代码会自动找
Content/Data/mock_compute_points.json) - Compute Point Class → 选择
BP_ComputePointActor - Point Altitude Meters →
50000(海拔 50km,可调)
步骤 9:测试 Phase A
- 点击顶部工具栏绿色 Play 按钮(或 Alt+P)
- 地球应该加载卫星影像
- 应该看到 10 个橙色球体分布在地球上(对应 mock JSON 里的 TOP500 超算)
- 鼠标移到球体上 → 变白色(Hover)
- 点击球体 → 变青色(Selected)
验证通过标准:
- 地球可见
- 橙色球体出现在正确位置(美国、日本、荷兰、芬兰等)
- 悬停变色
- 点击变色
第二阶段(Phase B):连接真实后端
步骤 10:确认后端新接口可用
后端代码已添加新路由,先验证它已经运行:
# 在 WSL 或终端里
curl http://localhost:8000/api/v1/ue/status
应该返回类似:
{"ok": true, "server_time": "...", "compute_points_count": 500, ...}
如果 curl 失败:
- 检查
planet.sh是否在运行(./planet.sh start) - 检查 WSL2 → Windows 的网络:在 UE 里使用
172.x.x.x(WSL 网关地址)而不是localhost
步骤 11:获取 WSL2 → Windows 的正确 IP
在 WSL 终端里运行:
cat /etc/resolv.conf | grep nameserver | awk '{print $2}'
记下这个 IP(例如 172.22.32.1)。
步骤 12:切换 DataManager 到实时模式
- 在 Outliner 里点击
BP_PlanetDataManager - Details 面板里:
- Use Local Mock Data → 取消勾选
- Backend Base URL → 填入
http://172.22.32.1:8000(你的实际 WSL IP)
- 重新 Play → DataManager 会通过 HTTP 拉取真实数据
步骤 13:绑定点击事件显示信息卡(可选,需要 UMG)
这步是可选的,需要创建一个 Widget Blueprint 来显示选中点的信息。
- Content Browser → 右键 → User Interface → Widget Blueprint
- 命名为
WBP_PointInfo
设计 Widget 布局:
- 双击打开
WBP_PointInfo - 从左侧 Palette 拖入以下控件到画布:
Canvas Panel(容器,设置为全屏)Border(右下角定位,用作信息卡背景,宽 300,高 200)Text Block× 4(名称、排名、算力、国家)
绑定事件(Blueprint 里操作):
- 打开
BP_PlanetDataManager的 Event Graph - 找到 BeginPlay 节点
- 拖出线 → 搜索 Bind Event to On Point Selected(这是我在 PlayerController 里定义的委托)
具体蓝图连线:从 PlayerController 获取 OnPointSelected → Bind → 在回调里 Create Widget WBP_PointInfo → Add to Viewport → Set 各个文本
文件结构总览
ue_client/
PlanetClient.uproject ← UE 项目入口
Config/
DefaultGame.ini ← GameMode 配置
DefaultEngine.ini ← 渲染/引擎设置
DefaultInput.ini ← 键鼠输入绑定
Content/
Data/
mock_compute_points.json ← Phase A 本地测试数据(10个超算)
Maps/
EarthMap.umap ← 你在步骤3创建的关卡
Blueprints/
BP_ComputePointActor ← 步骤7创建
BP_PlanetDataManager ← 步骤8创建
Source/
PlanetClient/
PlanetClient.Build.cs ← 模块依赖(HTTP、JSON、Cesium)
PlanetClient.h/.cpp ← 模块入口
PlanetDataTypes.h ← 数据结构定义(FComputePoint 等)
PlanetDataManager.h/.cpp ← HTTP 拉取 + 生成 Actor
ComputePointActor.h/.cpp ← 单个超算点的可视化 Actor
PlanetPlayerController.h/.cpp ← 鼠标点击、悬停、相机控制
PlanetGameMode.h/.cpp ← GameMode 入口
后端新接口一览
后端已新增以下接口(无需认证,直接访问):
| 接口 | 说明 |
|---|---|
GET /api/v1/ue/status |
健康检查 + 各数据源数量 |
GET /api/v1/ue/compute-points |
TOP500 超算数据(平铺 JSON) |
GET /api/v1/ue/landing-points |
海缆登陆点(平铺 JSON) |
GET /api/v1/ue/cables |
海缆路由几何(segments 数组) |
GET /api/v1/ue/satellites |
卫星 TLE 数据 |
常见问题
Q: 编译报错 "Cannot open include file: CesiumGeoreference.h"
A: Cesium for Unreal 没有正确安装,或者没有在 .uproject 里启用。检查:
- Epic Launcher → 插件是否安装到 5.3
PlanetClient.uproject里Plugins数组是否有CesiumForUnreal: true- UE 编辑器 → Edit → Plugins → 搜索 Cesium → 确认已勾选 Enabled
Q: Play 之后没有看到橙色球体
A: 按以下顺序排查:
- Output Log(Window → Output Log)里搜索
PlanetDataManager— 查看是否有报错 - 检查
BP_PlanetDataManager的 Details → Compute Point Class 是否已设置为BP_ComputePointActor - 检查 Mock Data Path 是否正确(留空则自动用
Content/Data/mock_compute_points.json) - 检查 Use Local Mock Data 是否已勾选
Q: 地球是灰色的没有卫星影像
A: 需要 Cesium ion 账号:
- Cesium 菜单 → Connect to Cesium ion
- 注册免费账号并授权
- 重新添加 Cesium ion Bing Maps Aerial tileset
Q: WSL2 里的后端 UE 无法访问(Phase B)
A: WSL2 和 Windows 是不同网络命名空间。方法:
- 在 WSL 里运行
ip route show default | awk '{print $3}'— 这是 Windows 主机的 IP - 后端绑定到
0.0.0.0:8000(检查uvicorn启动参数,应已如此配置) - 在 UE 的 DataManager 里填写这个 IP 而不是
localhost
Q: TransformLongitudeLatitudeHeightPositionToUnreal 不存在
A: Cesium for Unreal API 在不同版本有变化。如果编译报此错,将 PlanetDataManager.cpp 里的调用改为:
// Cesium for Unreal v1.x 的旧 API:
FVector WorldPos = Georeference->TransformLongitudeLatitudeHeightToUnreal(
Pt.Longitude, Pt.Latitude, PointAltitudeMeters);
// 或者通过 GeoTransforms:
#include "CesiumGlobeAnchorComponent.h"
// ... 见 Cesium 文档
Q: 点击球体没有反应
A:
- 确认
SphereMesh上 Collision Presets 不是NoCollision- 打开
BP_ComputePointActor→ 点击SphereMesh→ Details → Collision → 改为BlockAllDynamic
- 打开
- 确认 PlayerController 的
bEnableClickEvents = true(代码里已设置) - Output Log 里搜索是否有输入相关报错
下一步(一期完成后)
| 功能 | 说明 |
|---|---|
| 海缆路径渲染 | /api/v1/ue/cables 已就绪,需要在 UE 里用 Spline 绘制 |
| 信息卡 UMG | 创建 Widget Blueprint 并在 PlayerController OnPointSelected 里显示 |
| WebSocket 实时更新 | 后端已有 WebSocket,UE 端需要使用 WebSockets 插件 |
| 卫星轨迹 | TLE 数据已就绪,需要在 UE 里做轨道传播计算 |