# 玩家变身次数限制 - 实现总结

## 实现概述

✅ 已成功实现基于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`

