# MallardAbility（鸭子能力）使用说明

## 功能概述
MallardAbility 是专为鸭子（Mallard）设计的能力系统，使其能够在水中游泳，并且可以自定义水中移动参数。

## 核心功能

### 1. 水中游泳
- **只有鸭子能在水中游泳**：其他鸟类碰到水会死亡
- **自动调整移动参数**：进入水中时自动调整速度、重力和摩擦力
- **自动恢复参数**：离开水中时恢复原始移动参数

### 2. 可调整的水中参数

#### WaterSpeedMultiplier（水中速度倍率）
- **默认值**：0.8（80%的正常速度）
- **作用**：控制在水中游泳的速度
- **调整建议**：
  - 0.5 - 慢速游泳，更真实
  - 0.8 - 默认，略微减速
  - 1.0 - 与陆地速度相同
  - 1.2 - 水中游得更快

#### WaterGravityScale（水中重力缩放）
- **默认值**：0.3（30%的正常重力）
- **作用**：让鸭子在水中更容易浮起
- **调整建议**：
  - 0.1 - 几乎漂浮，非常轻
  - 0.3 - 默认，有浮力感
  - 0.5 - 稍微下沉
  - 1.0 - 正常重力，会下沉

#### WaterGroundFriction（水中摩擦力）
- **默认值**：2.0
- **作用**：控制在水中停止移动的速度
- **调整建议**：
  - 1.0 - 低摩擦，滑行距离长
  - 2.0 - 默认，适度摩擦
  - 4.0 - 高摩擦，立即停止

## 使用方法

### 在蓝图中调整参数

1. 打开 `BP_HeronPlayerState` 蓝图（或你的 PlayerState 蓝图）
2. 在 Details 面板中找到 `Mallard Ability Class`
3. 如果需要自定义参数：
   - 创建一个继承自 `MallardAbility` 的蓝图类（BP_MallardAbility）
   - 在蓝图中调整 `Water Speed Multiplier`、`Water Gravity Scale`、`Water Ground Friction`
   - 在 `BP_HeronPlayerState` 中将 `Mallard Ability Class` 设置为你的蓝图类

### 在 C++ 中调整参数

如果要在特定情况下动态调整参数，可以：

```cpp
// 获取 MallardAbility
if (UMallardAbility* MallardAbility = Cast<UMallardAbility>(PlayerState->CurrentAbility)) {
    // 动态调整水中速度
    MallardAbility->WaterSpeedMultiplier = 1.2f;
    
    // 如果已经在水中，需要重新应用参数
    if (MallardAbility->bIsSwimming) {
        MallardAbility->ExitWater();
        MallardAbility->EnterWater();
    }
}
```

## 工作流程

### 进入水中
1. HeronPlayer 检测到与标签为 "Water" 的 Actor 碰撞
2. 检查当前能力是否为 Mallard
3. 如果是 Mallard，调用 `EnterWater()`
4. MallardAbility 保存原始移动参数
5. 应用水中移动参数（速度 × 倍率、降低重力、调整摩擦力）

### 离开水中
1. HeronPlayer 检测到离开标签为 "Water" 的 Actor
2. 调用 MallardAbility 的 `ExitWater()`
3. 恢复原始移动参数

### 切换能力时在水中
- 如果从 Mallard 切换到其他能力且在水中，会自动调用 `ExitWater()` 恢复参数
- 如果切换到非 Mallard 能力且在水中，会触发死亡

## 调试建议

### 日志输出
系统会输出以下日志，可在 Output Log 中查看：
- `"MallardAbility: Entered Mallard ability - Can swim in water!"` - 切换到鸭子能力
- `"MallardAbility: Entered water - Swimming mode activated!"` - 进入水中
- `"MallardAbility: Exited water - Normal movement restored"` - 离开水中

### 实时查看参数
在编辑器 Play 模式下：
1. 选中玩家角色
2. 在 Details 面板中找到 `MallardAbility` 组件
3. 展开 `Mallard|Swimming` 分类
4. 可以看到 `bIsSwimming` 状态和当前参数

## 扩展建议

### 添加水花特效
在 `TickComponent` 中添加：
```cpp
if (bIsSwimming) {
    // 生成水花粒子效果
    // UGameplayStatics::SpawnEmitterAtLocation(...)
}
```

### 添加游泳动画
在 `EnterWater()` 中：
```cpp
// 切换到游泳动画
if (ACharacter* Character = Cast<ACharacter>(GetOwner())) {
    // 设置游泳动画状态
}
```

### 添加水深检测
可以扩展系统支持不同水深：
- 浅水：可以站立
- 深水：必须游泳
- 根据水深动态调整参数

## 配合系统

MallardAbility 与以下系统协同工作：
- **HeronPlayer**：水体碰撞检测
- **HeronPlayerState**：能力切换管理
- **CharacterMovementComponent**：移动参数调整

## 注意事项

1. 水体 Actor 必须有 "Water" 标签
2. 参数调整会影响游戏手感，建议多次测试
3. 如果在蓝图中创建子类，确保父类设置正确
4. 切换能力时会自动处理水中状态，无需手动管理

