Files
Colosseum/Assets/_Game/Scripts/AI/BossPatternData.cs
dal4segno e9e6257ad4 refactor: 집행개시 시그니처 전용 경로를 BT 일반 패턴 스텝으로 통합
- PatternStepType.ChargeWait 및 ChargeStepData 도입으로 충전/차단 판정을 일반 패턴 스텝으로 표현
- UsePatternByRoleAction에서 IsSignature 분기 완전 제거, 일반 패턴 경로로 통합
- BossCombatBehaviorContext에서 시그니처 전용 메서드 10개 이상 제거
- BossStaggerAction(신규): 충전 차단 성공 시 보스 경직 처리
- SignatureFailureEffectsAction(신규): 차단 실패 시 범위 피해/넉백/다운 적용
- RebuildDrogBehaviorAuthoringGraph에 시그니처 Sequence + outcomeBranch 구조 추가
- 집행개시 에셋 스텝 구성을 ChargeWait(3초) → Skill으로 변경
- BossHealthBarUI 시그니처 UI 비활성화, PlayerSkillDebugMenu 디버그 메서드 제거
2026-04-01 14:21:38 +09:00

128 lines
4.8 KiB
C#

using UnityEngine;
using System.Collections.Generic;
using Colosseum.Abnormalities;
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, ChargeWait }
/// <summary>
/// ChargeWait 스텝의 차단 관련 설정 데이터입니다.
/// 충전 대기 중 플레이어가 누적 피해를 충족하면 차단 성공으로 처리됩니다.
/// </summary>
[System.Serializable]
public class ChargeStepData
{
[Header("차단 조건")]
[Tooltip("차단에 필요한 누적 피해 비율 (보스 최대 체력 기준)")]
[Range(0f, 1f)]
[SerializeField] private float requiredDamageRatio = 0.1f;
[Header("전조 효과")]
[Tooltip("충전 중 부여할 전조 이상상태 (루핑 VFX 등)")]
[SerializeField] private AbnormalityData telegraphAbnormality;
[Header("차단 성공 효과")]
[Tooltip("차단 성공 시 보스 경직 시간")]
[Min(0f)]
[SerializeField] private float staggerDuration = 2f;
public float RequiredDamageRatio => requiredDamageRatio;
public AbnormalityData TelegraphAbnormality => telegraphAbnormality;
public float StaggerDuration => staggerDuration;
}
[System.Serializable]
public class PatternStep
{
public PatternStepType Type = PatternStepType.Skill;
public SkillData Skill;
[Min(0f)] public float Duration = 0.5f;
[Tooltip("ChargeWait 타입 전용 차단 설정")]
public ChargeStepData ChargeData;
}
/// <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("시그니처 패턴 여부 — 현재 사용되지 않음 (ChargeWait 스텝으로 대체)")]
[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;
}
}