Files
Colosseum/Assets/_Game/Scripts/AI/BehaviorActions/Actions/UseWeightedReadyPatternAction.cs
dal4segno 205b20e4e6 feat: 드로그 기본 루프 게이트를 BT로 이관
- big pattern grace period 판정을 런타임 헬퍼에서 제거하고 BT 조건/액션 노드로 명시

- Increment/Reset Basic Loop Count 노드 추가 및 BT_Drog 재빌드 반영

- Signature Failure Effects 수치를 BT 노드가 직접 보관하도록 정리
2026-04-10 09:22:56 +09:00

80 lines
3.3 KiB
C#

using System;
using Unity.Behavior;
using Unity.Properties;
using UnityEngine;
using Colosseum.Enemy;
namespace Colosseum.AI.BehaviorActions.Actions
{
/// <summary>
/// 준비된 후보 패턴 중 하나를 가중치 기반으로 선택하고 즉시 실행합니다.
/// </summary>
[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<BossPatternData> Pattern1;
[SerializeReference] public BlackboardVariable<float> Weight1 = new BlackboardVariable<float>(1f);
[SerializeReference] public BlackboardVariable<BossPatternData> Pattern2;
[SerializeReference] public BlackboardVariable<float> Weight2 = new BlackboardVariable<float>(1f);
[SerializeReference] public BlackboardVariable<BossPatternData> Pattern3;
[SerializeReference] public BlackboardVariable<float> Weight3 = new BlackboardVariable<float>(1f);
[SerializeReference] public BlackboardVariable<BossPatternData> Pattern4;
[SerializeReference] public BlackboardVariable<float> Weight4 = new BlackboardVariable<float>(1f);
[SerializeReference] public BlackboardVariable<BossPatternData> Pattern5;
[SerializeReference] public BlackboardVariable<float> Weight5 = new BlackboardVariable<float>(1f);
private BossPatternData selectedPattern;
protected override Status OnStart()
{
if (!TrySelectPattern(out selectedPattern))
return Status.Failure;
BossBehaviorRuntimeState context = GameObject.GetComponent<BossBehaviorRuntimeState>();
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);
}
}
}