Files
ggj26_heron/Docs/变身次数限制实现总结.md

112 lines
3.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 玩家变身次数限制 - 实现总结
## 实现概述
✅ 已成功实现基于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`