Ultraworked with [Sisyphus](https://github.com/code-yeonggu/oh-my-opencode) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
124 lines
4.7 KiB
C#
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,
|
|
}
|
|
}
|