feat(enemy): 追击起手前先转身朝玩家(播 Flip) + 冲刺速度可配置

- ContactChaseAbility:进入追击先 FaceDirection 朝玩家,若背对则播 Flip 转身、
  等 IsTurning 结束后再 Skill_Start(张口)→冲刺;已朝向玩家则跳过转身直接张口。
- 新增 _dashSpeed 字段(<=0 回退 Stats.RunSpeed),冲刺速度可在能力 Inspector 配置。
- E001 EnemyMovement._enableTurnAnimation=true(prefab+脚手架),转向播 AnimConfig.Turn
  (Flip),用于巡逻翻边与追击起手前转身;脚手架 PlaceE001 同步。

PlayMode 验证(brain 关隔离):背对玩家→触发追击→clip=Flip(IsTurning)→转向完成
facing 朝玩家→Skill_Start→冲刺→Skill_End,"先转身再张口"成立。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@
This commit is contained in:
2026-07-10 16:57:41 +08:00
parent 9eca69a6ba
commit db55889088
3 changed files with 23 additions and 6 deletions
@@ -21,11 +21,28 @@ namespace BaseGames.Enemies.Abilities
[Header("接触伤害")]
[SerializeField] private BodyContactDamage _contactDamage;
[Header("冲刺")]
[Tooltip("冲刺速度;<=0 时回退用 EnemyStatsSO.RunSpeed(追击速度)")]
[SerializeField] private float _dashSpeed = 0f;
protected override IEnumerator ExecuteCoroutine()
{
Phase = AbilityRunState.Active;
_enemy.SetEngaged(true);
// 冲刺方向:按玩家所在侧一次性确定(committed 冲锋)
float dir = (_enemy.PlayerTransform != null &&
_enemy.PlayerTransform.position.x < _enemy.transform.position.x) ? -1f : 1f;
var mv = _enemy.Movement;
// 先转身朝玩家(背对时播 Flip 转身动画),转身完成后再张口
if (mv != null)
{
mv.FaceDirection((int)dir);
while (mv.IsTurning)
yield return null;
}
// 起手:张口(一次性)。期间静止、不伤人;锁住动画防被步态覆盖。
if (_startClip.Clip != null)
{
@@ -34,11 +51,9 @@ namespace BaseGames.Enemies.Abilities
yield return EnemyAbilityWaits.Get(_startClip.Clip.length);
}
// 冲刺方向:起手后按玩家所在侧一次性确定(committed 冲锋)
float dir = (_enemy.PlayerTransform != null &&
_enemy.PlayerTransform.position.x < _enemy.transform.position.x) ? -1f : 1f;
float speed = _enemy.Stats != null ? _enemy.Stats.RunSpeed : 0f;
var mv = _enemy.Movement;
// 冲刺速度:优先能力配置的 _dashSpeed,否则回退 Stats.RunSpeed
float speed = _dashSpeed > 0f ? _dashSpeed
: (_enemy.Stats != null ? _enemy.Stats.RunSpeed : 0f);
// 冲刺:朝该方向直冲、接触伤害开、播 Skill_Loop,直到撞墙/到边缘或玩家消失即停。
if (_loopClip.Clip != null)