using System; using Unity.Behavior; using Unity.Properties; using UnityEngine; using Colosseum.Enemy; namespace Colosseum.AI.BehaviorActions.Actions { /// /// 준비된 후보 패턴 중 하나를 가중치 기반으로 선택하고 즉시 실행합니다. /// [Serializable, GeneratePropertyBag] [NodeDescription( name: "Use Weighted Ready Pattern", story: "준비된 후보 패턴 중 하나를 가중치 기반으로 선택해 실행", category: "Action", id: "6d4fc6fd-0ccd-4d9a-8b86-c602062f78a7")] public partial class UseWeightedReadyPatternAction : BossPatternActionBase { [SerializeReference] public BlackboardVariable Pattern1; [SerializeReference] public BlackboardVariable Weight1 = new BlackboardVariable(1f); [SerializeReference] public BlackboardVariable Pattern2; [SerializeReference] public BlackboardVariable Weight2 = new BlackboardVariable(1f); [SerializeReference] public BlackboardVariable Pattern3; [SerializeReference] public BlackboardVariable Weight3 = new BlackboardVariable(1f); [SerializeReference] public BlackboardVariable Pattern4; [SerializeReference] public BlackboardVariable Weight4 = new BlackboardVariable(1f); [SerializeReference] public BlackboardVariable Pattern5; [SerializeReference] public BlackboardVariable Weight5 = new BlackboardVariable(1f); private BossPatternData selectedPattern; protected override Status OnStart() { if (!TrySelectPattern(out selectedPattern)) return Status.Failure; BossBehaviorRuntimeState context = GameObject.GetComponent(); context?.LogDebug(nameof(UseWeightedReadyPatternAction), $"가중치 패턴 선택 후 실행: {selectedPattern.PatternName}"); return base.OnStart(); } protected override void OnEnd() { selectedPattern = null; base.OnEnd(); } protected override bool TryResolvePattern(out BossPatternData pattern, out GameObject target) { target = Target != null ? Target.Value : null; pattern = selectedPattern; if (pattern == null && !TrySelectPattern(out pattern)) return false; if (target == null) return false; return true; } private bool TrySelectPattern(out BossPatternData pattern) { WeightedPatternCandidate[] candidates = { new WeightedPatternCandidate(Pattern1?.Value, Weight1?.Value ?? 0f), new WeightedPatternCandidate(Pattern2?.Value, Weight2?.Value ?? 0f), new WeightedPatternCandidate(Pattern3?.Value, Weight3?.Value ?? 0f), new WeightedPatternCandidate(Pattern4?.Value, Weight4?.Value ?? 0f), new WeightedPatternCandidate(Pattern5?.Value, Weight5?.Value ?? 0f), }; return WeightedPatternSelector.TrySelectReadyPattern(GameObject, candidates, out pattern); } } }