4.4 KiB
4.4 KiB
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 - 高摩擦,立即停止
使用方法
在蓝图中调整参数
- 打开
BP_HeronPlayerState蓝图(或你的 PlayerState 蓝图) - 在 Details 面板中找到
Mallard Ability Class - 如果需要自定义参数:
- 创建一个继承自
MallardAbility的蓝图类(BP_MallardAbility) - 在蓝图中调整
Water Speed Multiplier、Water Gravity Scale、Water Ground Friction - 在
BP_HeronPlayerState中将Mallard Ability Class设置为你的蓝图类
- 创建一个继承自
在 C++ 中调整参数
如果要在特定情况下动态调整参数,可以:
// 获取 MallardAbility
if (UMallardAbility* MallardAbility = Cast<UMallardAbility>(PlayerState->CurrentAbility)) {
// 动态调整水中速度
MallardAbility->WaterSpeedMultiplier = 1.2f;
// 如果已经在水中,需要重新应用参数
if (MallardAbility->bIsSwimming) {
MallardAbility->ExitWater();
MallardAbility->EnterWater();
}
}
工作流程
进入水中
- HeronPlayer 检测到与标签为 "Water" 的 Actor 碰撞
- 检查当前能力是否为 Mallard
- 如果是 Mallard,调用
EnterWater() - MallardAbility 保存原始移动参数
- 应用水中移动参数(速度 × 倍率、降低重力、调整摩擦力)
离开水中
- HeronPlayer 检测到离开标签为 "Water" 的 Actor
- 调用 MallardAbility 的
ExitWater() - 恢复原始移动参数
切换能力时在水中
- 如果从 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 模式下:
- 选中玩家角色
- 在 Details 面板中找到
MallardAbility组件 - 展开
Mallard|Swimming分类 - 可以看到
bIsSwimming状态和当前参数
扩展建议
添加水花特效
在 TickComponent 中添加:
if (bIsSwimming) {
// 生成水花粒子效果
// UGameplayStatics::SpawnEmitterAtLocation(...)
}
添加游泳动画
在 EnterWater() 中:
// 切换到游泳动画
if (ACharacter* Character = Cast<ACharacter>(GetOwner())) {
// 设置游泳动画状态
}
添加水深检测
可以扩展系统支持不同水深:
- 浅水:可以站立
- 深水:必须游泳
- 根据水深动态调整参数
配合系统
MallardAbility 与以下系统协同工作:
- HeronPlayer:水体碰撞检测
- HeronPlayerState:能力切换管理
- CharacterMovementComponent:移动参数调整
注意事项
- 水体 Actor 必须有 "Water" 标签
- 参数调整会影响游戏手感,建议多次测试
- 如果在蓝图中创建子类,确保父类设置正确
- 切换能力时会自动处理水中状态,无需手动管理