112 lines
3.9 KiB
Markdown
112 lines
3.9 KiB
Markdown
# 玩家变身次数限制 - 实现总结
|
||
|
||
## 实现概述
|
||
|
||
✅ 已成功实现基于TileMap的玩家变身次数限制系统。
|
||
|
||
**核心设计**:
|
||
- LevelGMBase持有所有TileMap的变身次数配置
|
||
- 切换TileMap时自动更新PlayerState的变身次数
|
||
- PlayerState执行变身时检查并消耗次数
|
||
- 每个TileMap可以独立配置变身次数
|
||
|
||
## 代码修改清单
|
||
|
||
### 1. LevelGMBase.h
|
||
- ✅ 添加 `FTileMapTransformLimit` 结构体(TileMap标签 + 最大变身次数)
|
||
- ✅ 添加 `TileMapTransformLimits` 配置数组(策划在编辑器中配置)
|
||
- ✅ 添加 `CurrentTileMapName` 私有成员(跟踪当前TileMap)
|
||
- ✅ 添加 `UpdatePlayerTransformCount(FName)` 方法(更新玩家次数)
|
||
- ✅ 添加 `GetCurrentTransformCount()` 蓝图接口(查询当前剩余次数)
|
||
- ✅ 添加 `GetTileMapMaxTransformCount(FName)` 蓝图接口(查询TileMap配置)
|
||
|
||
### 2. LevelGMBase.cpp
|
||
- ✅ 在 `CreateLogicCamera()` 中设置初始TileMap并更新变身次数
|
||
- ✅ 在 `ChangeSubLevel()` 中切换TileMap时自动更新变身次数
|
||
- ✅ 实现 `UpdatePlayerTransformCount()` - 根据TileMap配置更新PlayerState
|
||
- ✅ 实现 `GetCurrentTransformCount()` - 从PlayerState获取当前剩余次数
|
||
- ✅ 实现 `GetTileMapMaxTransformCount()` - 查询指定TileMap的配置
|
||
|
||
### 3. HeronPlayerState.h
|
||
- ✅ 添加 `MaxTransformCount` 属性(由LevelGMBase设置)
|
||
- ✅ 添加 `RemainingTransformCount` 属性(运行时剩余次数)
|
||
- ✅ 添加 `GetRemainingTransformCount()` 方法
|
||
- ✅ 添加 `CanTransform()` 方法
|
||
- ✅ 添加 `AddTransformCount(int32)` 方法
|
||
- ✅ 添加 `ResetTransformCount()` 方法(保留但不需要手动调用)
|
||
|
||
### 4. HeronPlayerState.cpp
|
||
- ✅ 移除构造函数中的次数初始化(由LevelGMBase管理)
|
||
- ✅ 在 `SwitchAbility()` 中添加次数检查和消耗逻辑
|
||
|
||
## 工作流程
|
||
|
||
```
|
||
游戏开始
|
||
└─> LevelGMBase::BeginPlay()
|
||
└─> CreateLogicCamera()
|
||
└─> UpdatePlayerTransformCount(DefaultTileMapTag)
|
||
└─> 查找配置并设置PlayerState的变身次数
|
||
|
||
玩家切换TileMap
|
||
└─> ChangeSubLevel() / ChangeSubLevelByName()
|
||
└─> UpdatePlayerTransformCount(NewTileMapName)
|
||
└─> 重置PlayerState的变身次数为新TileMap的配置
|
||
|
||
玩家变身
|
||
└─> PlayerState::SwitchAbility()
|
||
└─> 检查 CanTransform()
|
||
├─> true: 执行变身,减少次数
|
||
└─> false: 拒绝变身,输出警告
|
||
```
|
||
|
||
## 配置示例
|
||
|
||
在LevelGMBase蓝图的Details面板中:
|
||
|
||
```
|
||
TileMapTransformLimits:
|
||
[0] TileMapTag: SubLevel_Tutorial, MaxTransformCount: -1 // 无限次
|
||
[1] TileMapTag: SubLevel_Level1, MaxTransformCount: 8 // 8次
|
||
[2] TileMapTag: SubLevel_Level2, MaxTransformCount: 6 // 6次
|
||
[3] TileMapTag: SubLevel_Boss1, MaxTransformCount: -1 // 无限次
|
||
```
|
||
|
||
## 蓝图使用示例
|
||
|
||
### 显示剩余次数UI
|
||
```blueprint
|
||
Get Game Mode -> Get Current Transform Count -> Set Text
|
||
```
|
||
|
||
### 道具增加次数
|
||
```blueprint
|
||
Get Player State -> Add Transform Count (Count = 1)
|
||
```
|
||
|
||
### 检查能否变身
|
||
```blueprint
|
||
Get Player State -> Can Transform? -> Branch
|
||
```
|
||
|
||
## 特性
|
||
|
||
1. **自动管理**: 切换TileMap时自动设置变身次数,无需手动配置
|
||
2. **灵活配置**: 每个TileMap可独立配置次数,支持无限次(-1)
|
||
3. **友好接口**: 提供完整的蓝图接口用于查询和修改
|
||
4. **详细日志**: 输出详细的日志便于调试
|
||
5. **道具支持**: 可以通过道具在同一TileMap内增加额外次数
|
||
|
||
## 注意事项
|
||
|
||
1. 未配置的TileMap默认为无限次(-1)
|
||
2. TileMapTag必须与场景中的TileMap标签完全匹配
|
||
3. 切换TileMap会重置变身次数,之前的剩余次数会丢失
|
||
4. 第一次变身也会消耗次数(除非是无限次)
|
||
5. 如需保存进度,应保存当前TileMap和剩余次数
|
||
|
||
## 文档
|
||
|
||
详细使用说明请参考:`Docs/玩家变身次数限制使用说明.md`
|
||
|