Files
Colosseum/Assets/_Game/Scripts/Enemy/BossPhaseData.cs
dal4segno c265f980db chore: Assets 디렉토리 구조 정리 및 네이밍 컨벤션 적용
- Assets/_Game/ 하위로 게임 에셋 통합
- External/ 패키지 벤더별 분류 (Synty, Animations, UI)
- 에셋 네이밍 컨벤션 확립 및 적용
  (Data_Skill_, Data_SkillEffect_, Prefab_, Anim_, Model_, BT_ 등)
- pre-commit hook으로 네이밍 컨벤션 자동 검사 추가
- RESTRUCTURE_CHECKLIST.md 작성

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-16 19:08:27 +09:00

124 lines
4.7 KiB
C#

using System;
using System.Collections.Generic;
using UnityEngine;
using Unity.Behavior;
namespace Colosseum.Enemy
{
/// <summary>
/// 보스 페이즈 전환 조건 타입
/// </summary>
public enum PhaseTransitionType
{
HealthPercent, // 체력 비율 기반
TimeElapsed, // 시간 경과
CustomCondition, // 커스텀 조건 (코드에서 설정)
Manual, // 수동 전환
}
/// <summary>
/// 보스 페이즈 데이터. 각 페이즈의 AI, 조건, 보상을 정의합니다.
/// </summary>
[CreateAssetMenu(fileName = "NewBossPhase", menuName = "Colosseum/Boss Phase")]
public class BossPhaseData : ScriptableObject
{
[Header("페이즈 정보")]
[SerializeField] private string phaseName = "Phase 1";
[TextArea(1, 3)]
[SerializeField] private string description;
[Header("전환 조건")]
[SerializeField] private PhaseTransitionType transitionType = PhaseTransitionType.HealthPercent;
[Tooltip("체력 비율 기반 전환 시, 이 비율 이하에서 페이즈 전환")]
[Range(0f, 1f)] [SerializeField] private float healthPercentThreshold = 0.7f;
[Tooltip("시간 기반 전환 시, 경과 시간 (초)")]
[Min(0f)] [SerializeField] private float timeThreshold = 60f;
[Tooltip("커스텀 조건 ID (코드에서 사용)")]
[SerializeField] private string customConditionId;
[Header("AI 설정")]
[Tooltip("이 페이즈에서 사용할 Behavior Graph")]
[SerializeField] private BehaviorGraph behaviorGraph;
[Tooltip("페이즈 전환 시 Blackboard 변수 오버라이드")]
[SerializeField] private List<BlackboardVariableOverride> blackboardOverrides = new();
[Header("페이즈 효과")]
[Tooltip("페이즈 시작 시 재생할 애니메이션")]
[SerializeField] private AnimationClip phaseStartAnimation;
[Tooltip("페이즈 전환 효과 (이펙트, 사운드 등)")]
[SerializeField] private GameObject phaseTransitionEffect;
// Properties
public string PhaseName => phaseName;
public string Description => description;
public PhaseTransitionType TransitionType => transitionType;
public float HealthPercentThreshold => healthPercentThreshold;
public float TimeThreshold => timeThreshold;
public string CustomConditionId => customConditionId;
public BehaviorGraph BehaviorGraph => behaviorGraph;
public IReadOnlyList<BlackboardVariableOverride> BlackboardOverrides => blackboardOverrides;
public AnimationClip PhaseStartAnimation => phaseStartAnimation;
public GameObject PhaseTransitionEffect => phaseTransitionEffect;
/// <summary>
/// 전환 조건 충족 여부 확인
/// </summary>
public bool CheckTransitionCondition(BossEnemy boss, float elapsedTime)
{
return transitionType switch
{
PhaseTransitionType.HealthPercent => boss.CurrentHealth / boss.MaxHealth <= healthPercentThreshold,
PhaseTransitionType.TimeElapsed => elapsedTime >= timeThreshold,
PhaseTransitionType.CustomCondition => boss.CheckCustomCondition(customConditionId),
PhaseTransitionType.Manual => false,
_ => false,
};
}
}
/// <summary>
/// Blackboard 변수 오버라이드 정보
/// </summary>
[Serializable]
public class BlackboardVariableOverride
{
[Tooltip("변수 이름")]
[SerializeField] private string variableName;
[Tooltip("변수 타입")]
[SerializeField] private BlackboardVariableType variableType = BlackboardVariableType.Float;
[Tooltip("설정할 값")]
[SerializeField] private float floatValue;
[SerializeField] private int intValue;
[SerializeField] private bool boolValue;
[SerializeField] private string stringValue;
[SerializeField] private GameObject gameObjectValue;
public string VariableName => variableName;
public BlackboardVariableType VariableType => variableType;
public float FloatValue => floatValue;
public int IntValue => intValue;
public bool BoolValue => boolValue;
public string StringValue => stringValue;
public GameObject GameObjectValue => gameObjectValue;
}
/// <summary>
/// Blackboard 변수 타입
/// </summary>
public enum BlackboardVariableType
{
Float,
Int,
Bool,
String,
GameObject,
}
}