/* * @Author: 白哉 * @Description: * @Date: 2025年06月06日 星期五 19:06:16 * @Modify: */ using System; using Logic.AI; using NodeCanvas.Framework; using ParadoxNotion.Design; using UnityEngine; namespace NodeCanvas.Tasks.Actions { [Name("找最近的我方领土目标")] [Category("AI节点")] [Serializable] public class AIParamRecentlySelfTerritoryTarget : BaseActionTask { protected override string desc { get { return string.Format($"找最近的我方领土目标"); } } protected override void OnExecute() { base.OnExecute(); // 直接从Blackboard获取AICalculatorData var data = blackboard.GetVariable("Data"); if (data?.value?.TargetParam.UnitData == null) { EndAction(false); return; } var param = data.value.TargetParam; if (!param.MapData.GetGridDataByUnitId(param.UnitData.Id, out var unitGrid)) { EndAction(false); return; } var set = param.MapData.GetPlayerTerritoryGridIdSet(param.PlayerData.Id); var minDis = int.MaxValue; Vector2Int[] targetPath = null; foreach (var gridId in set) { if (!param.MapData.GridMap.GetGridDataByGid(gridId, out var selfGrid)) continue; if (param.MapData.GridMap.CalcDistance(selfGrid, unitGrid) >= minDis) continue; var path = PathFinder.FindPath((int)param.MapData.MapConfig.Width, (int)param.MapData.MapConfig.Height, new(unitGrid.Pos.X, unitGrid.Pos.Y), new(selfGrid.Pos.X, selfGrid.Pos.Y), param.MapData, param.PlayerData,param.UnitData); if (!path.found) continue; if (path.length >= minDis) continue; minDis = path.length; targetPath = path.path; } data.value.TargetList.Clear(); if (targetPath != null) { for (int i = 1; i < targetPath.Length; i++) { if (param.MapData.GridMap.GetGridDataByPos(targetPath[i].x, targetPath[i].y, out var grid) ) data.value.TargetList.Add(grid.Id); } } EndAction(data.value.TargetList.Count > 0); } } }