# UE5 3D 大屏场景搭建完整指南

## 目录

1. [项目初始化](#项目初始化)
2. [安装 Cesium 插件](#安装-cesium-插件)
3. [创建主场景](#创建主场景)
4. [配置光照](#配置光照)
5. [设置相机](#设置相机)
6. [添加蓝图组件](#添加蓝图组件)
7. [配置后端连接](#配置后端连接)
8. [测试运行](#测试运行)

---

## 项目初始化

### 步骤 1: 创建 UE5 项目

```
1. 打开 Epic Games Launcher
2. 选择 Unreal Engine 5.3+ (推荐 5.4)
3. 点击 "New Project" → "Games"
4. 选择 "Blank" 模板
5. 设置:
   ├─ 项目名: Planet
   ├─ 位置: D:\games\Planet\
   ├─ 目标: Desktop / Console
   ├─ 质量: Maximum
   ├─ -starter content: false
   └─ raytracing: false
6. 点击 "Create Project"
```

### 步骤 2: 项目设置

```
Edit → Project Settings:

显示设置:
├─ Render → Default Viewport:
│   ├─ Fullscreen Mode: Windowed
│   ├─ Resolution: 3840×2160 (4K)
│   └─ Custom Near Clip Plane: 100
├─ Input:
│   ├─ Capture Mouse on Launch: true
│   └─ Enable Click Events: true
└─ Quality:
    └─ Shadow Quality: High
```

---

## 安装 Cesium 插件

### 方法 1: 通过 Marketplace (推荐)

```
1. 打开 UE5 编辑器
2. Edit → Plugins
3. 搜索 "Cesium for Unreal"
4. 点击 "Enable"
5. 重启编辑器
```

### 方法 2: 手动安装

```
1. 从 GitHub 下载:
   https://github.com/CesiumGS/cesium-unreal/releases

2. 解压到:
   D:\games\Planet\unreal\Plugins\Cesium

3. 编辑uproject文件:
   {
       "Plugins": [
           {
               "Name": "Cesium",
               "Enabled": true
           }
       ]
   }

4. 右键 Planet.uproject → "Generate Visual Studio project files"
5. 重新打开项目
```

### 配置 Cesium ion Token

```
Edit → Project Settings → Cesium:

1. Cesium ion:
   ├─ Default Access Token: 粘贴你的 token
   │   eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
   └─ Default Server: https://ion.cesium.com

2. Cesium World Terrain:
   ├─ Enable: true
   ├─ Ellipsoid: WGS84
   └─ Terrain Exaggeration: 1.0

3. Cesium OSM Buildings:
   ├─ Enable: true
   └─ Style: Gray
```

---

## 创建主场景

### 步骤 1: 创建新关卡

```
1. File → New Level → Default
2. 删除默认的:
   ├─ Floor
   ├─ Wall_400
   ├─ Wall_400x400
   └─ PlayerStart
3. 保存为: Content/Levels/Main.umap
4. 设置为启动关卡:
   Edit → Project Settings → Maps & Modes
   └─ Default Level Name: Main
```

### 步骤 2: 添加 Cesium 组件

从 "Cesium" 面板拖入:

```
1. CesiumGeoreference
   └─ 位置: (0, 0, 0)
   └─ 属性: 自动设置

2. CesiumWorldTerrain
   └─ 位置: (0, 0, 0)
   └─ 属性:
       ├─ Enable Collision: false
       └─ Create Pawns: false

3. CesiumSunSky
   └─ 位置: (0, 0, 0)
   └─ 属性:
       ├─ Use Solar Time: true
       └─ Solar Time: 2024-01-01 12:00:00
```

### 步骤 3: 配置地球位置

```
选中 CesiumGeoreference:

├─ Origin Location:
│   ├─ Latitude: 0
│   ├─ Longitude: 0
│   └─ Height: 0
│
├─ Target Viewport:
│   ├─ Width: 3840
│   └─ Height: 2160
│
└─ Camera:
    └─ Default Camera Class: None
```

---

## 配置光照

### 步骤 1: 设置太阳光照

```
选中 CesiumSunSky:

├─ Atmospheric Sun Light:
│   └─ 指向 DirectionalLight_Sun
│
├─ Direction:
│   ├─ Azimuth: 180
│   └─ Altitude: 45
│
├─ Sky Light:
│   └─ Sky Light Actor → SkyLight
│
└─ Atmospheric Fog:
    ├─ Fog Density: 0.02
    ├─ Fog Falloff: 0.2
    └─ Volumetric Fog: true
```

### 步骤 2: 添加辅助光照

```
1. 添加 DirectionalLight_Sun:
   ├─ Intensity: 10 lux
   ├─ Light Color: (1, 0.95, 0.8)
   └─ Cast Shadows: true

2. 添加 Skylight:
   ├─ Intensity: 1.0
   ├─ Color: (0.5, 0.7, 1.0)
   └─ Real-time Capture: false
```

### 步骤 3: 后处理

```
添加 PostProcessVolume (Unbound):

├─ Exposure:
│   ├─ Min EV100: 10
│   ├─ Max EV100: 20
│   ├─ Speed Up: 2
│   ├─ Speed Down: 2
│   └─ Target EV100: 12
│
├─ Bloom:
│   ├─ Intensity: 1.0
│   ├─ Threshold: 1.0
│   └─ Method: Convolution
│
├─ Color Grading:
│   ├─ Saturation: (1, 1, 1)
│   ├─ Contrast: 1.0
│   └─ Gamma: 1.0
│
└─ Vignette:
    └─ Intensity: 0.5
```

---

## 设置相机

### 步骤 1: 创建相机控制器

```
创建 Blueprint: BP_CameraController (父类: Actor)

组件:
├─ SceneRoot
│   └─ SpringArm
│       └─ Camera
│
变量:
├─ TargetRadius: Float = 500000
├─ ZoomSpeed: Float = 50000
├─ RotateSpeed: Float = 1.0
└─ bIsRotating: Boolean = false
```

### 步骤 2: 配置相机移动

```
输入绑定 (Edit → Project Settings → Input):

├─ Mouse X:
│   └─ Event: Rotate Yaw
│       └─ Add Controller Yaw Input × -1
│
├─ Mouse Y:
│   └─ Event: Rotate Pitch
│       └─ Add Controller Pitch Input × -1
│
├─ Mouse Wheel:
│   └─ Event: Zoom
│       ├─ Add Controller Zoom In (放大)
│       └─ Add Controller Zoom Out (缩小)
│
└─ Right Mouse Button:
    ├─ Event: 按下 → bIsRotating = true
    └─ Event: 松开 → bIsRotating = false
```

### 步骤 3: 自动巡航

```
创建 Timeline: AutoRotate

├─ 持续时间: 60秒
├─ 循环: true
└─ 曲线:
    0%: 0
    100%: 360

Tick Event:
├─ 分支: bAutoRotate == true
│   ├─ Play Timeline
│   └─ Add Controller Yaw Output
└─ 否则: 跳过
```

---

## 添加蓝图组件

### 步骤 1: 放置 GlobeController

```
1. 从 Content Browser 拖入 BP_GlobeController
2. 位置: (0, 0, 0)
3. 确保 CesiumGeoreference 在其下
```

### 步骤 2: 设置初始相机

```
1. 在 World Outliner 中选择 Camera
2. 设置位置:
   ├─ X: 0
   ├─ Y: -2000000
   └─ Z: 1000000
3. 设置旋转:
   ├─ Pitch: -30
   └─ Yaw: 0
```

### 步骤 3: 配置数据管理器

```
选中 BP_GlobeController:

├─ API_URL: http://localhost:8000
├─ WS_URL: ws://localhost:8000/ws
├─ UpdateInterval: 30.0
├─ bAutoRotate: true
└─ RotateSpeed: 0.5
```

---

## 配置后端连接

### 步骤 1: 测试后端服务

```bash
# 在 WSL 中启动后端
cd /home/ray/dev/linkong/planet
docker restart planet_backend_new

# 测试 API
curl http://localhost:8000/api/v1/collected/summary
```

### 步骤 2: 配置 CORS (如果需要)

```
后端已配置 CORS:
├─ http://localhost:3000
├─ http://0.0.0.0:3000
└─ http://frontend:3000
```

### 步骤 3: 测试 WebSocket

```
在 UE5 蓝图中:

1. 创建 WebSocket 连接
   └─ URL: ws://localhost:8000/ws

2. 发送订阅消息:
   {
       "action": "subscribe",
       "channels": ["updates", "alarms"]
   }

3. 监听消息并处理
```

---

## 测试运行

### 步骤 1: 编译蓝图

```
1. 点击工具栏 "Compile" 按钮
2. 检查错误日志
3. 修复任何错误
```

### 步骤 2: 运行测试

```
1. 点击 "Play" 按钮
2. 检查:
   ├─ 地球是否正常显示
   ├─ Cesium 地形是否加载
   ├─ 太阳光照是否正确
   └─ 相机控制是否工作

3. 打开输出日志检查错误
```

### 步骤 3: 打包发布

```
1. File → Package Project → Windows (64-bit)
2. 选择输出目录: D:\games\Planet\Dist\
3. 等待打包完成
4. 测试打包后的可执行文件
```

---

## 常见问题

### Q1: Cesium 地形不显示

```
解决方案:
1. 检查 Cesium ion Token 是否正确
2. 检查网络连接
3. 确认 CesiumWorldTerrain 已启用
4. 查看输出日志错误信息
```

### Q2: 相机控制不工作

```
解决方案:
1. 确保 PlayerController 启用输入
2. 检查输入绑定是否正确
3. 确认相机组件已附加
4. 检查是否有其他 Actor 捕获输入
```

### Q3: WebSocket 连接失败

```
解决方案:
1. 检查后端服务是否运行
2. 确认 CORS 配置正确
3. 检查防火墙设置
4. 验证 URL 格式正确
```

### Q4: 性能问题

```
解决方案:
1. 降低渲染分辨率
2. 禁用不必要的特效
3. 减少粒子数量
4. 使用 LOD
5. 启用虚拟纹理
```

---

## 下一步

1. **添加数据点** - 创建 BP_Supercomputer 实例
2. **添加海缆** - 创建 BP_SubmarineCable 实例
3. **添加数据流** - 创建 BP_DataFlow 实例
4. **配置 UI** - 添加 W_MainHUD 等界面
5. **优化性能** - 根据实际运行调整
