From db55889088619dff352dc215aa42b1bb67821814 Mon Sep 17 00:00:00 2001 From: Joywayer Date: Fri, 10 Jul 2026 16:57:41 +0800 Subject: [PATCH] =?UTF-8?q?@=20feat(enemy):=20=E8=BF=BD=E5=87=BB=E8=B5=B7?= =?UTF-8?q?=E6=89=8B=E5=89=8D=E5=85=88=E8=BD=AC=E8=BA=AB=E6=9C=9D=E7=8E=A9?= =?UTF-8?q?=E5=AE=B6(=E6=92=AD=20Flip)=20+=20=E5=86=B2=E5=88=BA=E9=80=9F?= =?UTF-8?q?=E5=BA=A6=E5=8F=AF=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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) @ --- .../Prefabs/Enemies/E001/ENM_CaoZhi.prefab | 3 ++- .../Editor/Scene/SceneObjectPlacerTool.cs | 1 + .../Enemies/Abilities/ContactChaseAbility.cs | 25 +++++++++++++++---- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/Assets/_Game/Prefabs/Enemies/E001/ENM_CaoZhi.prefab b/Assets/_Game/Prefabs/Enemies/E001/ENM_CaoZhi.prefab index aae0b871..b15479df 100644 --- a/Assets/_Game/Prefabs/Enemies/E001/ENM_CaoZhi.prefab +++ b/Assets/_Game/Prefabs/Enemies/E001/ENM_CaoZhi.prefab @@ -326,7 +326,7 @@ MonoBehaviour: m_EditorClassIdentifier: _config: {fileID: 11400000, guid: 508afd17a0cf2fe47935c78097c3b093, type: 2} _spriteRenderer: {fileID: 7572402007749840909} - _enableTurnAnimation: 0 + _enableTurnAnimation: 1 _animancer: {fileID: 7326741988116792408} _animConfig: {fileID: 11400000, guid: 06936c5bc3358904cb269abdfa60ed14, type: 2} _visualRoot: {fileID: 1594798921504223030} @@ -603,6 +603,7 @@ MonoBehaviour: _Clip: {fileID: 7400000, guid: 9f0fea347ba7eb347b0f71b423832808, type: 2} _NormalizedStartTime: NaN _contactDamage: {fileID: 9135205194319985817} + _dashSpeed: 0 references: version: 2 RefIds: [] diff --git a/Assets/_Game/Scripts/Editor/Scene/SceneObjectPlacerTool.cs b/Assets/_Game/Scripts/Editor/Scene/SceneObjectPlacerTool.cs index 6bced0ff..30933ee7 100644 --- a/Assets/_Game/Scripts/Editor/Scene/SceneObjectPlacerTool.cs +++ b/Assets/_Game/Scripts/Editor/Scene/SceneObjectPlacerTool.cs @@ -510,6 +510,7 @@ namespace BaseGames.Editor AssignAsset(movement, "_config", report, false, "ENM_E001_Stats"); AssignAsset(movement, "_animConfig", report, false, "ENM_E001_AnimConfig"); + AssignBool(movement, "_enableTurnAnimation", true); // 转向播 Flip(巡逻翻边/追击起手前转身) AssignReference(movement, "_visualRoot", visual, report); AssignReference(movement, "_animancer", animancer, report); AssignReference(movement, "_spriteRenderer", sr1, report); diff --git a/Assets/_Game/Scripts/Enemies/Abilities/ContactChaseAbility.cs b/Assets/_Game/Scripts/Enemies/Abilities/ContactChaseAbility.cs index 4c08f062..8f997877 100644 --- a/Assets/_Game/Scripts/Enemies/Abilities/ContactChaseAbility.cs +++ b/Assets/_Game/Scripts/Enemies/Abilities/ContactChaseAbility.cs @@ -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)