修复行为树一些问题

This commit is contained in:
wuwenbo 2025-06-18 21:26:49 +08:00
parent 2c4fc113f2
commit b66f735c92
3 changed files with 111 additions and 13 deletions

View File

@ -38,6 +38,7 @@ RenderSettings:
m_ReflectionIntensity: 1
m_CustomReflection: {fileID: 0}
m_Sun: {fileID: 0}
m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1}
m_UseRadianceAmbientProbe: 0
--- !u!157 &3
LightmapSettings:
@ -12269,10 +12270,10 @@ RectTransform:
m_Children: []
m_Father: {fileID: 1243696580}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 112.445, y: -35}
m_SizeDelta: {x: 84.89, y: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &85187974
MonoBehaviour:
@ -60895,6 +60896,84 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 394711511}
m_CullTransparentMesh: 1
--- !u!1 &395918545
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 395918548}
- component: {fileID: 395918547}
- component: {fileID: 395918546}
m_Layer: 0
m_Name: AIBT
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &395918546
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 395918545}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: b98a6db0b653f764eac834f85857a9dd, type: 3}
m_Name:
m_EditorClassIdentifier:
_parentBlackboard: {fileID: 11400000, guid: 54af86fc7df8ad84ba30333205e32a2c, type: 2}
_serializedBlackboard: '{"_variables":{}}'
_objectReferences: []
_serializedVariables: []
--- !u!114 &395918547
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 395918545}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: aad115aca74ce3c4891b3f6de0b4aae8, type: 3}
m_Name:
m_EditorClassIdentifier:
_serializedExposedParameters: []
_boundGraphSerialization:
_boundGraphObjectReferences: []
_boundGraphSource:
_version: 0
_category:
_comments:
_translation: {x: 0, y: 0}
_zoomFactor: 1
_firstActivation: 2
_enableAction: 0
_disableAction: 0
_lockBoundGraphPrefabOverrides: 1
_preInitializeSubGraphs: 0
_updateMode: 3
_graph: {fileID: 11400000, guid: be76ba4e003c482489c2bb30da007cb8, type: 2}
_blackboard: {fileID: 395918546}
--- !u!4 &395918548
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 395918545}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 1268.7635, y: 605.7429, z: 7.64894}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &397028032
GameObject:
m_ObjectHideFlags: 0
@ -322673,3 +322752,4 @@ SceneRoots:
- {fileID: 727821838}
- {fileID: 656929328}
- {fileID: 1136548652}
- {fileID: 395918548}

View File

@ -257,10 +257,16 @@ namespace Logic.AI
}
CalculateCityStrategy();
var count = 0;
while (true)
{
CalculateLegionStrategy();
if (CalculateFreeUnitStrategy()) break;
if (CalculateLegionStrategy()) if (CalculateFreeUnitStrategy()) break;
count++;
if (count > 20)
{
Debug.LogError($"死循环了");
break;
}
}
TargetParam.OnParamChanged();
}
@ -282,8 +288,9 @@ namespace Logic.AI
}
// 计算军团战略
public void CalculateLegionStrategy()
public bool CalculateLegionStrategy()
{
foreach (var kv in StrategyLegion) kv.Value.Clear();
LegionUnits.Clear();
FreeUnits.Clear();
LegionScore.Clear();
@ -393,7 +400,7 @@ namespace Logic.AI
if (isFinish) continue;
}
if (LegionTargetCity.Count == LegionUnits.Count) return;
if (LegionTargetCity.Count == LegionUnits.Count) return true;
var waitLegions = new List<uint>();
foreach (var kv in LegionUnits)
{
@ -423,7 +430,7 @@ namespace Logic.AI
StrategyLegion[Strategy.Defend].Add(result.LegionId);
}
if (LegionTargetCity.Count == LegionUnits.Count) return;
if (LegionTargetCity.Count == LegionUnits.Count) return true;
uint targetId = 0;
foreach (var city in selfCity)
{
@ -457,7 +464,7 @@ namespace Logic.AI
StrategyLegion[Strategy.Attack].Add(result.LegionId);
}
if (LegionTargetCity.Count == LegionUnits.Count) return;
if (LegionTargetCity.Count == LegionUnits.Count) return true;
uint targetId = 0;
foreach (var city in Map.CityMap.CityList)
{
@ -504,6 +511,8 @@ namespace Logic.AI
LegionUnits[legionId][0].LegionId = 0;
FreeUnits.Add(LegionUnits[legionId][0]);
LegionUnits.Remove(legionId);
Debug.Log($"解散军团{legionId}");
return false;
}
StrategyLegion[Strategy.Development].Add(legionId);
@ -524,9 +533,12 @@ namespace Logic.AI
maxUnit.LegionId = 0;
FreeUnits.Add(maxUnit);
LegionUnits[legionId].Remove(maxUnit);
Debug.Log($"{legionId} 军团抛弃小兵 {maxUnit.Id}");
return false;
}
}
}
return true;
}
// 计算自由人策略
@ -625,6 +637,7 @@ namespace Logic.AI
if (legion != 0)
{
Debug.Log($"加入军团{legion}");
unit.LegionId = legion;
return false;
}
@ -665,12 +678,13 @@ namespace Logic.AI
if (CountryStrategy == Strategy.Attack || CountryStrategy == Strategy.Defend)
{
uint legionId = 0;
uint legionId = 1;
foreach (var kv in LegionUnits)
{
if (legionId <= kv.Key) legionId = kv.Key + 1;
}
unit.LegionId = legionId;
Debug.Log($"成立");
return false;
}
StrategyUnit[Strategy.Development].Add(unit);

View File

@ -9,6 +9,7 @@
using System.Collections.Generic;
using Logic.Action;
using RuntimeData;
using UnityEngine;
namespace Logic.AI
{
@ -276,6 +277,7 @@ namespace Logic.AI
{
if (!data.Map.GridMap.GetGridDataByGid(gridId, out var grid)) continue;
data.TargetParam.GridData = grid;
data.TargetParam.OnParamChanged();
foreach (var action in actions)
{
if (!action.CheckCan(data.TargetParam)) continue;
@ -326,10 +328,10 @@ namespace Logic.AI
foreach (var grid in data.Map.GridMap.GridList)
{
var result = Main.UnitLogic.CheckUnitCanMoveOrAttack(data.Map, data.TargetParam.UnitData, grid);
if (result != MoveAttackType.Move) continue;
if (result != MoveAttackType.Move && result != MoveAttackType.MoveToPort && result != MoveAttackType.MoveAshore) continue;
if (data.TargetParam.UnitData.MP <= 0) continue;
data.TargetParam.GridData = grid;
data.TargetParam.OnParamChanged();
foreach (var action in actions)
{
if (!action.CheckCan(data.TargetParam)) continue;
@ -342,6 +344,7 @@ namespace Logic.AI
{
if (data.TargetParam.UnitData == null) return;
if (!data.TargetParam.UnitData.Alive) return;
if (data.TargetParam.UnitData.AP <= 0) return;
data.TargetParam.MainObjectType = ActionLogicFactory.GetMainObjectType(type);
Main.UnitLogic.CalcUnitMoveInfo(data.Map, data.TargetParam.UnitData.Id);
@ -353,6 +356,7 @@ namespace Logic.AI
data.TargetParam.GridData = grid;
data.TargetParam.TargetUnitData = targetUnit;
data.TargetParam.OnParamChanged();
foreach (var action in actions)
{