增加城市行为调试

This commit is contained in:
wuwenbo 2025-06-24 18:16:05 +08:00
parent 5521af6313
commit b05bcb935a
7 changed files with 86 additions and 26 deletions

View File

@ -37,6 +37,7 @@ namespace NodeCanvas.Tasks.Actions
data.value.IsExcute = true;
data.value.MaxAiAction.CheckIsActionInPlayerSight();
data.value.IsInSight = data.value.MaxAiAction.IsInSight;
data.value.Time = data.value.MaxAiAction.ActionLogic.GetAnimTime(data.value.MaxAiAction.Param);
EndAction(true);
}
}

View File

@ -54,7 +54,6 @@ namespace NodeCanvas.Tasks.Actions
if (!param.MapData.GetCityDataByGid(grid.Id, out var city)) continue;
if (param.MapData.GetUnitDataByGid(grid.Id, out var cityUnit)) continue;
if (!selfCity.Contains(city)) continue;
data.value.TargetParam.CityData = city;
data.value.TargetParam.TargetGridData = grid;
data.value.TargetParam.OnParamChanged();
EndAction(true);

View File

@ -158,6 +158,7 @@ namespace Logic.AI
public bool IsExcute;
public bool IsFinish;
public bool IsInSight;
public float Time;
public AICalculatorData()
@ -203,6 +204,7 @@ namespace Logic.AI
IsFinish = false;
IsInSight = false;
Time = 0.1f;
}
public void Refresh(MapData map, PlayerData player)
@ -212,6 +214,7 @@ namespace Logic.AI
IsFinish = false;
IsInSight = false;
IsExcute = false;
Time = 0.1f;
AIActions.Clear();
TargetParam = new CommonActionParams();
@ -305,8 +308,10 @@ namespace Logic.AI
IsFinish = false;
IsInSight = false;
IsExcute = false;
Time = 0.1f;
AIActions.Clear();
MaxAiAction = null;
TargetParam = new CommonActionParams();
TargetParam.MapData = Map;
TargetParam.PlayerData = Player;

View File

@ -40,7 +40,7 @@ namespace Logic.AI
{
public AILogicState AILogicState;
private float _recordTime;
private float _targetTime;
private AIActionScoreCalculator _scoreCalculator;
private AIActionGenerator _generator;
@ -96,8 +96,7 @@ namespace Logic.AI
if (AILogicState == AILogicState.Finished || AILogicState == AILogicState.Prepare) return;
if (AILogicState == AILogicState.Pausing)
{
if (Time.time - _recordTime > DebugCenter.Instance.DebugAIActionTime)
AILogicState = AILogicState.Playing;
if (Time.time > _targetTime) AILogicState = AILogicState.Playing;
}
if (AILogicState == AILogicState.Playing)
@ -126,8 +125,9 @@ namespace Logic.AI
if (_data.IsExcute)
{
AILogicState = AILogicState.Pausing;
if (!_data.IsInSight) _recordTime -= DebugCenter.Instance.DebugAIActionTime - 0.04f;
else _recordTime = Time.time;
if (!_data.IsInSight) _targetTime = Time.time + 0.04f;
else _targetTime = Time.time + _data.Time;
MainEditor.Instance.OnActionExcuted();
}
else AILogicState = AILogicState.Finished;
}

View File

@ -33,6 +33,7 @@ namespace Logic.Editor
private GUIStyle _whiteBoxStyle;
private PlayerData _player;
private CityData _city;
private Main _main;
@ -73,6 +74,7 @@ namespace Logic.Editor
OnGUIRunTime();
OnShowPlayerInfo();
OnShowCityInfo();
EditorGUILayout.EndScrollView();
}
@ -95,21 +97,28 @@ namespace Logic.Editor
if (InspectorUtils.InspectorButtonWithTextWidth($"玩家{player.Id}")) _player = player;
}
EditorGUILayout.EndHorizontal();
var selfCity = new HashSet<CityData>();
_main.MapData.GetCityDataListByPlayerId(_main.MapData.PlayerMap.SelfPlayerId, selfCity);
EditorGUILayout.BeginHorizontal();
foreach (var city in _main.MapData.CityMap.CityList)
{
if (selfCity.Contains(city)) continue;
if (InspectorUtils.InspectorButtonWithTextWidth($"城市{city.Id}")) _city = city;
}
EditorGUILayout.EndHorizontal();
}
private void OnShowPlayerInfo()
{
if (_main?.MapData == null || _player == null) return;
GUI.skin.button.wordWrap = true;
_barPosition = EditorGUILayout.BeginScrollView(_barPosition);
MainEditor.Instance.GetPlayerStrategy(_player.Id, out var playerStrategy);
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b>玩家ID: {_player.Id}, 国家战略为: {playerStrategy}</b>");
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginVertical(_whiteBoxStyle);
EditorGUILayout.BeginVertical(_redBoxStyle);
InspectorUtils.InspectorTextWidthRich($"<b>城市信息</b>");
var selfCity = new HashSet<CityData>();
_main.MapData.GetCityDataListByPlayerId(_player.Id, selfCity);
@ -124,7 +133,7 @@ namespace Logic.Editor
EditorGUILayout.Space();
EditorGUILayout.Space();
EditorGUILayout.BeginVertical(_whiteBoxStyle);
EditorGUILayout.BeginVertical(_redBoxStyle);
InspectorUtils.InspectorTextWidthRich($"<b>小兵信息</b>");
var selfUnits = new HashSet<UnitData>();
_main.MapData.GetUnitDataListByPlayerId(_player.Id, selfUnits);
@ -137,8 +146,36 @@ namespace Logic.Editor
}
EditorGUILayout.EndVertical();
}
EditorGUILayout.EndScrollView();
private void OnShowCityInfo()
{
if (_main?.MapData == null || _city == null) return;
var actions = MainEditor.Instance.GetCityActions(_city.Id);
if (actions == null || actions.Count == 0) return;
foreach (var aiAction in actions)
{
EditorGUILayout.BeginVertical(_whiteBoxStyle);
if (aiAction.Param.GridData != null)
InspectorUtils.InspectorTextWidthRich($"<b>位置:</b> {aiAction.Param.GridData.Pos.X}, {aiAction.Param.GridData.Pos.Y}");
InspectorUtils.InspectorTextWidthRich($"<b>ActionType:</b> {aiAction.ActionLogic.ActionId.ActionType}");
InspectorUtils.InspectorTextWidthRich($"<b>WonderType:</b> {aiAction.ActionLogic.ActionId.WonderType}");
InspectorUtils.InspectorTextWidthRich($"<b>ResourceType:</b> {aiAction.ActionLogic.ActionId.ResourceType}");
InspectorUtils.InspectorTextWidthRich($"<b>FeatureType:</b> {aiAction.ActionLogic.ActionId.FeatureType}");
InspectorUtils.InspectorTextWidthRich($"<b>TerrainType:</b> {aiAction.ActionLogic.ActionId.TerrainType}");
InspectorUtils.InspectorTextWidthRich($"<b>UnitType:</b> {aiAction.ActionLogic.ActionId.UnitType}");
InspectorUtils.InspectorTextWidthRich($"<b>GiantType:</b> {aiAction.ActionLogic.ActionId.GiantType}");
InspectorUtils.InspectorTextWidthRich($"<b>Vegetation:</b> {aiAction.ActionLogic.ActionId.Vegetation}");
InspectorUtils.InspectorTextWidthRich($"<b>UnitActionType:</b> {aiAction.ActionLogic.ActionId.UnitActionType}");
InspectorUtils.InspectorTextWidthRich($"<b>CityLevelUpActionType:</b> {aiAction.ActionLogic.ActionId.CityLevelUpActionType}");
InspectorUtils.InspectorTextWidthRich($"<b>GridMiscActionType:</b> {aiAction.ActionLogic.ActionId.GridMiscActionType}");
InspectorUtils.InspectorTextWidthRich($"<b>SkillType:</b> {aiAction.ActionLogic.ActionId.SkillType}");
InspectorUtils.InspectorTextWidthRich($"<b>TechType:</b> {aiAction.ActionLogic.ActionId.TechType}");
EditorGUILayout.EndVertical();
EditorGUILayout.Space();
}
}
}
}

View File

@ -162,6 +162,7 @@ namespace Logic
_aiPlayers.Add(playerData);
}
MainEditor.Instance.OnAIStarted();
Update();
}

View File

@ -21,6 +21,7 @@ namespace Logic
private Dictionary<uint, Strategy> _unitStrategy;
private Dictionary<uint, Strategy> _legionStrategy;
private Dictionary<uint, uint> _unitTarget;
private Dictionary<uint, List<AIActionBase>> _actionRecord;
public static MainEditor Instance = new MainEditor();
@ -31,30 +32,46 @@ namespace Logic
_unitStrategy = new Dictionary<uint, Strategy>();
_legionStrategy = new Dictionary<uint, Strategy>();
_unitTarget = new Dictionary<uint, uint>();
}
public bool GetPlayerStrategy(uint pid, out Strategy strategy)
{
strategy = Strategy.None;
if (!_playerStrategy.TryGetValue(pid, out strategy)) return false;
return true;
_actionRecord = new Dictionary<uint, List<AIActionBase>>();
}
public bool GetUnitStrategy(uint uid, uint legion, uint playerId, out Strategy strategy, out uint cityId)
public void OnAIStarted()
{
_actionRecord.Clear();
}
public void OnActionExcuted()
{
if (Data.MaxAiAction?.Param?.CityData == null) return;
if (!_actionRecord.ContainsKey(Data.MaxAiAction.Param.CityData.Id))
_actionRecord[Data.MaxAiAction.Param.CityData.Id] = new List<AIActionBase>();
_actionRecord[Data.MaxAiAction.Param.CityData.Id].Add(Data.MaxAiAction);
}
public List<AIActionBase> GetCityActions(uint cid)
{
return _actionRecord.GetValueOrDefault(cid);
}
public void GetPlayerStrategy(uint pid, out Strategy strategy)
{
strategy = Strategy.None;
_playerStrategy.TryGetValue(pid, out strategy);
}
public void GetUnitStrategy(uint uid, uint legion, uint playerId, out Strategy strategy, out uint cityId)
{
cityId = 0;
strategy = Strategy.None;
_unitTarget.TryGetValue(uid, out cityId);
if (legion == 0 && !_unitStrategy.TryGetValue(uid, out strategy))return false;
if (legion != 0 && !_legionStrategy.TryGetValue(legion * 10000 + playerId, out strategy))return false;
return true;
if (legion == 0 && !_unitStrategy.TryGetValue(uid, out strategy))return;
if (legion != 0 && !_legionStrategy.TryGetValue(legion * 10000 + playerId, out strategy))return;
}
public bool GetCityStrategy(uint cid, out Strategy strategy)
public void GetCityStrategy(uint cid, out Strategy strategy)
{
strategy = Strategy.None;
if (!_cityStrategy.TryGetValue(cid, out strategy)) return false;
return true;
_cityStrategy.TryGetValue(cid, out strategy);
}
public void Update()