162 lines
4.2 KiB
Markdown
162 lines
4.2 KiB
Markdown
# ClientRunner 集成说明
|
||
|
||
## 概览
|
||
|
||
`ClientRunner` 已更新为支持自动启动 Pinball Standalone 模式。它现在作为游戏的主入口点,自动管理 `PinballManager` 的创建和配置。
|
||
|
||
## 新增功能
|
||
|
||
### 1. 自动模式启动
|
||
- 根据 `mode` 属性自动启动相应的游戏模式
|
||
- 当前完全支持 `RunMode.STANDALONE`
|
||
- 为多人模式预留了扩展接口
|
||
|
||
### 2. 节点引用管理
|
||
- **主相机节点**: 自动配置给 PinballManager
|
||
- **渲染容器**: 游戏对象渲染的父节点
|
||
- **UI容器**: UI界面的容器节点
|
||
|
||
### 3. 智能回退
|
||
- 如果未设置渲染容器,自动使用当前节点
|
||
- 如果未设置相机节点,PinballManager 会尝试自动查找
|
||
|
||
## 使用方法
|
||
|
||
### 在场景中设置 ClientRunner
|
||
|
||
1. **添加 ClientRunner 组件**
|
||
```
|
||
在场景中创建一个节点(建议命名为 "GameManager")
|
||
添加 ClientRunner 组件
|
||
```
|
||
|
||
2. **配置属性**
|
||
```typescript
|
||
运行模式: Standalone (选择下拉菜单中的值)
|
||
主相机节点: 拖拽场景中的 Main Camera 节点
|
||
渲染容器: 拖拽或创建一个渲染容器节点
|
||
UI容器: 拖拽或创建一个UI容器节点(可选)
|
||
```
|
||
|
||
3. **运行游戏**
|
||
- 启动场景,ClientRunner 会自动:
|
||
- 创建 PinballManager
|
||
- 配置所有必需的引用
|
||
- 启动 Standalone 模式
|
||
- 开始弹珠物理模拟
|
||
|
||
## 代码示例
|
||
|
||
### 基本用法
|
||
```typescript
|
||
// ClientRunner 会在 start() 方法中自动运行
|
||
// 无需手动调用
|
||
|
||
// 获取 PinballManager 实例(如果需要)
|
||
const pinballManager = clientRunner.getPinballManager();
|
||
|
||
// 重启游戏
|
||
await clientRunner.restart();
|
||
```
|
||
|
||
### 高级配置
|
||
```typescript
|
||
// 在运行时切换模式(如果添加了对应实现)
|
||
clientRunner.mode = RunMode.CLIENT_MULTIPLAYER;
|
||
await clientRunner.restart();
|
||
|
||
// 检查当前模式
|
||
if (clientRunner.isMode('standalone')) {
|
||
console.log('当前正在运行单机模式');
|
||
}
|
||
```
|
||
|
||
## 场景设置建议
|
||
|
||
### 推荐的节点层级结构
|
||
```
|
||
Scene
|
||
├── Main Camera (Camera 组件)
|
||
├── GameManager (ClientRunner 组件)
|
||
├── RenderContainer (空节点,用作渲染容器)
|
||
│ └── [游戏对象将在此创建]
|
||
└── UIContainer (空节点,UI元素容器)
|
||
└── [UI元素]
|
||
```
|
||
|
||
### 最小设置
|
||
如果只想快速测试,最少只需要:
|
||
```
|
||
Scene
|
||
├── Main Camera
|
||
└── GameManager (ClientRunner 组件)
|
||
├── mode: Standalone
|
||
└── cameraNode: Main Camera
|
||
```
|
||
|
||
## 控制台输出
|
||
|
||
成功启动时会看到以下日志:
|
||
```
|
||
[ClientRunner] 开始启动,运行模式: standalone
|
||
[ClientRunner] 启动 Standalone 模式...
|
||
[ClientRunner] Standalone 模式启动成功
|
||
[PinballManager] 初始化完成
|
||
[StandaloneMode] 初始化完成
|
||
```
|
||
|
||
## 游戏交互
|
||
|
||
启动成功后:
|
||
- **点击/触摸屏幕**: 在点击位置创建弹珠
|
||
- **弹珠物理**: 弹珠受重力影响下落并与边界碰撞
|
||
- **实时渲染**: 弹珠位置实时更新显示
|
||
|
||
## 故障排除
|
||
|
||
### 常见问题
|
||
|
||
1. **WASM 加载失败**
|
||
```
|
||
确保 assets/wasm/pinball_physics.wasm 文件存在
|
||
文件大小应该是 666KB
|
||
```
|
||
|
||
2. **相机未找到**
|
||
```
|
||
检查 cameraNode 是否正确设置
|
||
确保相机节点有 Camera 组件
|
||
```
|
||
|
||
3. **渲染不显示**
|
||
```
|
||
检查 renderContainer 设置
|
||
确保渲染容器在相机视野内
|
||
```
|
||
|
||
4. **控制台错误**
|
||
```
|
||
查看具体错误信息
|
||
检查所有必需的文件是否存在
|
||
确认节点引用是否正确设置
|
||
```
|
||
|
||
## 扩展功能
|
||
|
||
### 为多人模式做准备
|
||
`ClientRunner` 已经为多人模式预留了接口:
|
||
- `startClientMultiplayerMode()`
|
||
- `startServerMultiplayerMode()`
|
||
|
||
当实现这些模式时,只需要在对应方法中添加逻辑即可。
|
||
|
||
### 自定义配置
|
||
可以通过修改 `startStandaloneMode()` 方法来自定义 PinballManager 的配置:
|
||
```typescript
|
||
// 自定义物理参数
|
||
this.pinballManager.defaultMode = PinballMode.STANDALONE;
|
||
this.pinballManager.autoStart = true;
|
||
this.pinballManager.debugMode = false; // 关闭调试信息
|
||
```
|
||
|
||
这个更新让游戏启动变得更加简单和自动化,同时保持了扩展性和配置灵活性。 |