2025-05-22 11:55:24 +08:00

159 lines
5.4 KiB
C#

/*
* @Author: 白哉
* @Description: AI 逻辑总模块
* @Date: 2025年04月01日 星期二 14:04:01
* @Modify:
*/
using System.Collections.Generic;
using System.Diagnostics;
using Logic.Action;
using UnityEngine;
using RuntimeData;
using Debug = UnityEngine.Debug;
namespace Logic.AI
{
public enum AILogicState
{
Prepare,
Playing,
Pausing,
Finished,
}
public enum AIActionType
{
Grid,
City,
Unit,
Tech,
Max,
}
public class AILogic
{
public AILogicState AILogicState;
private float _recordTime;
private AIActionScoreCalculator _scoreCalculator;
private AIActionGenerator _generator;
private List<AIActionBase> RecordActions;
private AIActionBase MaxScoreAction;
private MapData _mapData;
private PlayerData _playerData;
private AIConfigAsset _cfg;
public AILogic()
{
AILogicState = AILogicState.Prepare;
RecordActions = new List<AIActionBase>();
_scoreCalculator = new AIActionScoreCalculator();
_cfg = Resources.Load<AIConfigAsset>("DataAssets/AIConfig");
_generator = new AIActionGenerator();
}
// 开始 AI 逻辑
public void StartAILogic(MapData mapData, PlayerData playerData)
{
AILogicState = AILogicState.Playing;
_mapData = mapData;
_playerData = playerData;
_generator.Init(_mapData, _playerData);
}
// 结束 AI 逻辑
public void FinishAILogic()
{
RecordActions.Clear();
}
// 更新 AI 逻辑
public void Update()
{
if (AILogicState == AILogicState.Finished || AILogicState == AILogicState.Prepare) return;
if (AILogicState == AILogicState.Pausing)
{
if (Time.time - _recordTime > DebugCenter.Instance.DebugAIActionTime) AILogicState = AILogicState.Playing;
}
if (AILogicState == AILogicState.Playing)
{
Stopwatch sw = new Stopwatch();
sw.Start();
RecordActions.Clear();
_generator.GeneratorOneStepActions(_mapData, _playerData, RecordActions);
CalculateMaxScoreAction();
if (sw.Elapsed.TotalMilliseconds > 20) Debug.Log($"{_generator.ActionType} 耗时:{sw.Elapsed.TotalMilliseconds} ms");
// AI 执行已结束
if (!GetAILogicPermission())
{
AILogicState = AILogicState.Finished;
}
// 无行动可执行
else if(MaxScoreAction == null)
{
AILogicState = AILogicState.Finished;
FinishAILogic();
}
// 执行行动
else
{
MaxScoreAction.Param.MapData = _mapData;
MaxScoreAction.Param.RefreshParams();
if (MaxScoreAction.ActionLogic is UnitAttackAction)
{
_mapData.GetGridDataByUnitId(MaxScoreAction.Param.UnitData.Id, out var grid);
_mapData.GetGridDataByUnitId(MaxScoreAction.Param.TargetUnitData.Id, out var target);
Debug.Log($"小兵攻击 {MaxScoreAction.Param.UnitData.Id}, " +
$"位置{grid.Pos.X}, {grid.Pos.Y}, " +
$"目标 {MaxScoreAction.Param.TargetUnitData.Id}, " +
$"目标位置{target.Pos.X}, {target.Pos.Y}");
}
if (MaxScoreAction.ActionLogic is UnitMoveAction)
{
_mapData.GetGridDataByUnitId(MaxScoreAction.Param.UnitData.Id, out var grid);
Debug.Log($"小兵移动 {MaxScoreAction.Param.UnitData.Id}, " +
$"位置{grid.Pos.X}, {grid.Pos.Y}, " +
$"目标 {MaxScoreAction.Param.GridData.Pos.X}, {MaxScoreAction.Param.GridData.Pos.Y}");
}
MaxScoreAction.CheckIsActionInPlayerSight();
MaxScoreAction.ActionLogic.Execute(MaxScoreAction.Param);
AILogicState = AILogicState.Pausing;
_recordTime = Time.time;
if (!MaxScoreAction.IsInSight) _recordTime -= DebugCenter.Instance.DebugAIActionTime - 0.04f;
MaxScoreAction = null;
}
}
}
// 获取 AI 执行权限
private bool GetAILogicPermission()
{
return true;
}
// 选取最高得分行动
private void CalculateMaxScoreAction()
{
if (RecordActions.Count == 0) return;
MaxScoreAction = _scoreCalculator.CalculateMaxScoreAIAction(_mapData, _playerData, RecordActions, _cfg);
if (MaxScoreAction != null && MaxScoreAction.ActionLogic.ActionId != null &&
MaxScoreAction.ActionLogic.ActionId.ActionType == CommonActionType.LearnTech)
{
Debug.LogWarning($"学习科技了!!!!! {MaxScoreAction.ActionLogic.ActionId.TechType}");
}
}
}
}