TH1/Unity/Assets/Scripts/BTNodeCanvas/AIParamChooseMaxKillScore.cs
2026-01-07 17:21:53 +08:00

81 lines
2.6 KiB
C#

/*
* @Author: 白哉
* @Description:
* @Date: 2025年10月21日 星期二 17:10:56
* @Modify:
*/
using System;
using Logic.AI;
using NodeCanvas.Framework;
using ParadoxNotion.Design;
namespace NodeCanvas.Tasks.Actions
{
[Name("筛选最高值目标格子(>0)")]
[Category("AI节点")]
[Serializable]
public class AIParamChooseMaxKillScore : BaseActionTask
{
public bool KillScore = true;
public bool AttackScore = false;
public bool ThreatScore = false;
protected override string desc
{
get
{
if (ThreatScore) return $"选取威胁分最高的目标格子";
if (AttackScore) return $"选取攻击分最高的目标格子";
if (KillScore) return $"选取击杀分最高的目标格子";
return "";
}
}
protected override void OnExecute()
{
base.OnExecute();
// 直接从Blackboard获取AICalculatorData
var data = blackboard.GetVariable<AICalculatorData>("Data");
if (data?.value?.AIActions == null)
{
EndAction(false);
return;
}
// 限制三个bool值只有一个为true
if (ThreatScore)
{
KillScore = false;
AttackScore = false;
}
if (AttackScore) KillScore = false;
AIActionBase action = null;
var maxScore = 0f;
for (int i = data.value.AIActions.Count - 1; i >= 0; i--)
{
var map = data.value.AIActions[i].Param.MapData;
var unit = data.value.AIActions[i].Param.UnitData;
var grid = data.value.AIActions[i].Param.GridData;
if (map == null || grid == null || unit == null) continue;
var score = 0f;
if (ThreatScore)
score = data.value.CalGridThreatScore(map, unit, grid);
else if (AttackScore)
score = data.value.CalGridAttackGainScore(map, unit, grid);
else if (KillScore)
score = data.value.CalGridKillScore(map, unit, grid);
if (score <= maxScore) continue;
action = data.value.AIActions[i];
maxScore = score;
}
data.value.AIActions.Clear();
if (action != null) data.value.AIActions.Add(action);
EndAction(data.value.AIActions.Count > 0);
}
}
}