Files
Colosseum/Assets/_Game/Scripts/AI/BossPatternData.cs
dal4segno c6fc56e9c6 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 에셋 자동 재구성 메뉴 제공
2026-03-30 15:34:21 +09:00

97 lines
3.6 KiB
C#

using UnityEngine;
using System.Collections.Generic;
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]
public class PatternStep
{
public PatternStepType Type = PatternStepType.Skill;
public SkillData Skill;
[Min(0f)] public float Duration = 0.5f;
}
/// <summary>
/// 보스 패턴 데이터. 순서대로 실행할 스텝(스킬 또는 대기) 목록과 쿨타임을 정의합니다.
/// </summary>
[CreateAssetMenu(fileName = "NewBossPattern", menuName = "Colosseum/Boss Pattern")]
public class BossPatternData : ScriptableObject
{
[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>();
[Header("쿨타임")]
[Min(0f)]
[Tooltip("패턴 완료 후 다시 사용 가능해지기까지의 시간")]
[SerializeField] private float cooldown = 5f;
[Header("페이즈 제한")]
[Min(1)]
[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;
}
}