143 lines
4.4 KiB
Markdown
143 lines
4.4 KiB
Markdown
# 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. 切换能力时会自动处理水中状态,无需手动管理
|
||
|