2025-05-15 17:23:11 +08:00

138 lines
4.1 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();
MaxScoreAction.ActionLogic.Execute(MaxScoreAction.Param);
MaxScoreAction = null;
AILogicState = AILogicState.Pausing;
_recordTime = Time.time;
}
}
}
// 获取 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}");
}
}
}
}