diff --git a/Assets/_Game/Data/Patterns/Data_Pattern_Drog_점프.asset b/Assets/_Game/Data/Patterns/Data_Pattern_Drog_점프.asset index e6c67989..531bb1bb 100644 --- a/Assets/_Game/Data/Patterns/Data_Pattern_Drog_점프.asset +++ b/Assets/_Game/Data/Patterns/Data_Pattern_Drog_점프.asset @@ -1,4 +1,4 @@ -%YAML 1.1 +%YAML 1.1 %TAG !u! tag:unity3d.com,2011: --- !u!114 &11400000 MonoBehaviour: @@ -24,4 +24,4 @@ MonoBehaviour: Skill: {fileID: 11400000, guid: 16321efbd1f2498458683bac7605b054, type: 2} Duration: 0 cooldown: 1 - + minPhase: 2 diff --git a/Assets/_Game/Data/Patterns/Data_Pattern_Drog_집행개시.asset b/Assets/_Game/Data/Patterns/Data_Pattern_Drog_집행개시.asset index 3ad7976e..a3d22bf0 100644 --- a/Assets/_Game/Data/Patterns/Data_Pattern_Drog_집행개시.asset +++ b/Assets/_Game/Data/Patterns/Data_Pattern_Drog_집행개시.asset @@ -21,3 +21,4 @@ MonoBehaviour: Skill: {fileID: 0} Duration: 0 cooldown: 45 + minPhase: 3 diff --git a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckPatternReadyActionBase.cs b/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckPatternReadyActionBase.cs index 35e467c8..7c069ab3 100644 --- a/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckPatternReadyActionBase.cs +++ b/Assets/_Game/Scripts/AI/BehaviorActions/Actions/CheckPatternReadyActionBase.cs @@ -29,6 +29,12 @@ public abstract partial class CheckPatternReadyActionBase : Action return Status.Failure; BossPatternData pattern = context.GetPattern(PatternRole); + if (pattern == null) + return Status.Failure; + + if (context.CurrentPatternPhase < pattern.MinPhase) + return Status.Failure; + return UsePatternAction.IsPatternReady(GameObject, pattern) ? Status.Success : Status.Failure; } } diff --git a/Assets/_Game/Scripts/AI/BossPatternData.cs b/Assets/_Game/Scripts/AI/BossPatternData.cs index f016cb24..fb32833e 100644 --- a/Assets/_Game/Scripts/AI/BossPatternData.cs +++ b/Assets/_Game/Scripts/AI/BossPatternData.cs @@ -31,8 +31,14 @@ namespace Colosseum.AI [Tooltip("패턴 완료 후 다시 사용 가능해지기까지의 시간")] [SerializeField] private float cooldown = 5f; + [Header("페이즈 제한")] + [Min(1)] + [Tooltip("이 패턴을 사용하기 시작하는 최소 페이즈 (1=Phase 1부터)")] + [SerializeField] private int minPhase = 1; + public string PatternName => patternName; public IReadOnlyList Steps => steps; public float Cooldown => cooldown; + public int MinPhase => minPhase; } } diff --git a/Assets/_Game/Scripts/Enemy/BossCombatBehaviorContext.cs b/Assets/_Game/Scripts/Enemy/BossCombatBehaviorContext.cs index a74b6511..5d263ce7 100644 --- a/Assets/_Game/Scripts/Enemy/BossCombatBehaviorContext.cs +++ b/Assets/_Game/Scripts/Enemy/BossCombatBehaviorContext.cs @@ -91,9 +91,6 @@ namespace Colosseum.Enemy [Min(1)] [SerializeField] protected int phase3SecondaryInterval = 2; [Header("Signature Pattern")] - [Tooltip("시그니처 패턴을 사용하기 시작하는 최소 페이즈")] - [Min(1)] [SerializeField] protected int signatureMinPhase = 2; - [Tooltip("시그니처 패턴 차단에 필요한 누적 피해 비율")] [Range(0f, 1f)] [SerializeField] protected float signatureRequiredDamageRatio = 0.1f; @@ -497,16 +494,13 @@ namespace Colosseum.Enemy if (IsBehaviorSuppressed) return false; - if (CurrentPatternPhase < signatureMinPhase) - return false; - if (activePatternCoroutine != null || isSignaturePatternActive) return false; if (bossEnemy.IsDead || bossEnemy.IsTransitioning || skillController.IsPlayingAnimation) return false; - return UsePatternAction.IsPatternReady(gameObject, signaturePattern); + return IsPatternReady(signaturePattern); } /// @@ -692,6 +686,9 @@ namespace Colosseum.Enemy if (pattern == null || pattern.Steps == null || pattern.Steps.Count == 0) return false; + if (CurrentPatternPhase < pattern.MinPhase) + return false; + if (!patternCooldownTracker.TryGetValue(pattern, out float readyTime)) return true;