refactor: 드로그 BT 의사결정 투명화 — 모든 조건을 BT 노드로 표시
- BossCombatPatternRole enum 완전 제거, BossPatternData에 직접 필드 추가 - 14개 패턴별 Check*/Use*Action → CheckPatternReadyCondition + UsePatternByRoleAction으로 통합 - BT 계단식 Branch 체인 구조 도입 (BranchingConditionComposite + FloatingPort) - 패턴별 고유 전제 조건을 BT Condition으로 분리 - Punish: IsDownedTargetInRangeCondition (다운 대상 반경) - Mobility: IsTargetBeyondDistanceCondition (원거리 대상) - Utility: IsTargetBeyondDistanceCondition (원거리 대상) - Primary: IsTargetInAttackRangeCondition (사거리 이내) - Phase 진입 조건을 BT에서 확인 가능하도록 IsMinPhaseSatisfiedCondition 추가 - IsPatternReady()에서 minPhase 체크 분리 → 전용 Condition으로 노출 - Secondary 패턴 개념 제거 (secondaryPattern, 보조 차례, 교대 카운터 로직 전부 삭제) - CanResolvePatternTargetCondition 삭제 (7개 중 5개가 노이즈) - RebuildDrogBehaviorAuthoringGraph로 BT 에셋 자동 재구성 메뉴 제공
This commit is contained in:
@@ -4,6 +4,34 @@ using Colosseum.Skills;
|
||||
|
||||
namespace Colosseum.AI
|
||||
{
|
||||
/// <summary>
|
||||
/// 패턴의 대분류. grace period 판단에 사용됩니다.
|
||||
/// </summary>
|
||||
public enum PatternCategory
|
||||
{
|
||||
/// <summary>기본 패턴 — grace period 제한 없음</summary>
|
||||
Basic,
|
||||
/// <summary>대형 패턴 — basicLoopCount 이후 사용 가능</summary>
|
||||
Big,
|
||||
/// <summary>징벌 패턴 — 항상 허용, bigPattern 카운터 리셋</summary>
|
||||
Punish,
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 패턴의 타겟 해석 방식
|
||||
/// </summary>
|
||||
public enum TargetResolveMode
|
||||
{
|
||||
/// <summary>타겟 해석 불필요 (시그니처 등 내부 처리)</summary>
|
||||
None,
|
||||
/// <summary>가장 위협도가 높은 근접 대상</summary>
|
||||
HighestThreat,
|
||||
/// <summary>기동 패턴 전용 타겟</summary>
|
||||
Mobility,
|
||||
/// <summary>유틸리티 패턴 전용 타겟</summary>
|
||||
Utility,
|
||||
}
|
||||
|
||||
public enum PatternStepType { Skill, Wait }
|
||||
|
||||
[System.Serializable]
|
||||
@@ -23,6 +51,16 @@ namespace Colosseum.AI
|
||||
[Header("패턴 정보")]
|
||||
[SerializeField] private string patternName;
|
||||
|
||||
[Header("패턴 특성")]
|
||||
[Tooltip("패턴 분류 — grace period 판단에 사용")]
|
||||
[SerializeField] private PatternCategory category = PatternCategory.Basic;
|
||||
[Tooltip("시그니처 패턴 여부 — 전용 실행 경로 사용")]
|
||||
[SerializeField] private bool isSignature;
|
||||
[Tooltip("근접 패턴 여부 — meleePatternCounter 갱신")]
|
||||
[SerializeField] private bool isMelee;
|
||||
[Tooltip("타겟 해석 방식")]
|
||||
[SerializeField] private TargetResolveMode targetMode = TargetResolveMode.HighestThreat;
|
||||
|
||||
[Header("스텝 순서")]
|
||||
[SerializeField] private List<PatternStep> steps = new List<PatternStep>();
|
||||
|
||||
@@ -36,9 +74,23 @@ namespace Colosseum.AI
|
||||
[Tooltip("이 패턴을 사용하기 시작하는 최소 페이즈 (1=Phase 1부터)")]
|
||||
[SerializeField] private int minPhase = 1;
|
||||
|
||||
[Header("조건부 점프")]
|
||||
[Tooltip("점프 스텝에서 대상을 찾지 못하면 해당 스텝을 스킵하고 패턴을 종료합니다 (조합 패턴용)")]
|
||||
[SerializeField] private bool skipJumpStepOnNoTarget = false;
|
||||
|
||||
public string PatternName => patternName;
|
||||
public PatternCategory Category => category;
|
||||
public bool IsSignature => isSignature;
|
||||
public bool IsMelee => isMelee;
|
||||
public TargetResolveMode TargetMode => targetMode;
|
||||
public IReadOnlyList<PatternStep> Steps => steps;
|
||||
public float Cooldown => cooldown;
|
||||
public int MinPhase => minPhase;
|
||||
public bool SkipJumpStepOnNoTarget => skipJumpStepOnNoTarget;
|
||||
|
||||
/// <summary>
|
||||
/// Big 패턴인지 반환합니다 (grace period 대상).
|
||||
/// </summary>
|
||||
public bool IsBigPattern => category == PatternCategory.Big;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user