2025-10-25 15:58:42 +08:00

200 lines
7.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 Logic.CrashSight;
using NodeCanvas.BehaviourTrees;
using NodeCanvas.Framework;
using UnityEngine;
using RuntimeData;
using TH1_Anim;
using Debug = UnityEngine.Debug;
namespace Logic.AI
{
public enum AILogicState
{
Prepare,
Playing,
PrePlay,
Pausing,
Finished,
}
public enum AIActionType
{
Grid,
City,
Unit,
Tech,
Max,
}
public class AILogic
{
public AILogicState AILogicState;
public PlayerData PlayerData => _playerData;
private float _targetTime;
private AIActionScoreCalculator _scoreCalculator;
private AIActionGenerator _generator;
private List<AIActionBase> RecordActions;
private AIActionBase MaxScoreAction;
private MapData _mapData;
private PlayerData _playerData;
private AIConfigAsset _cfg;
private GameObject _logicObject;
private BehaviourTreeOwner _btOwner;
private AICalculatorData _data;
public AILogic()
{
AILogicState = AILogicState.Prepare;
RecordActions = new List<AIActionBase>();
_scoreCalculator = new AIActionScoreCalculator();
_cfg = Resources.Load<AIConfigAsset>("Export/AIConfig");
_generator = new AIActionGenerator();
_logicObject = GameObject.Find("AIBT");
_btOwner = _logicObject.GetComponent<BehaviourTreeOwner>();
var data = _btOwner.blackboard.GetVariable<AICalculatorData>("Data");
if (data.value == null)
{
_data = new AICalculatorData();
data.value = _data;
}
else _data = data.value;
}
// 开始 AI 逻辑
public void StartAILogic(MapData mapData, PlayerData playerData)
{
AILogicState = AILogicState.Playing;
_mapData = mapData;
_playerData = playerData;
var aiDiff = _cfg.GetAIDiffInfo(_mapData.MapConfig.AIDiff);
_data.AiDiffInfo = aiDiff;
_generator.Init(_mapData, _playerData);
_data.Refresh(mapData, playerData);
_btOwner.StopBehaviour();
_btOwner.StartBehaviour();
MainEditor.Instance.Data = _data;
}
// 结束 AI 逻辑
public void FinishAILogic()
{
_playerData = null;
AILogicState = AILogicState.Prepare;
RecordActions.Clear();
}
// 更新 AI 逻辑
public void Update()
{
if (AILogicState == AILogicState.Finished || AILogicState == AILogicState.Prepare) return;
if (AILogicState == AILogicState.Pausing)
{
if (Time.time > _targetTime) AILogicState = AILogicState.Playing;
}
if (AILogicState == AILogicState.Playing)
{
var index = 0;
while (true)
{
if (MainEditor.Instance.IsEditor && !MainEditor.Instance.IsGo) return;
index++;
_data.ClearCache();
_btOwner.UpdateBehaviour();
MainEditor.Instance.IsGo = false;
if (_data.MaxAiAction != null || _data.IsFinish) break;
if (index > 100)
{
LogSystem.LogError($"死循环了,最终记录点为:{MainEditor.Instance.BTNodeId}");
break;
}
}
if (_data.MaxAiAction == null || index > 100) AILogicState = AILogicState.Finished;
else
{
_data.MaxAiAction.ActionLogic.CompleteExecute(_data.MaxAiAction.Param);
_data.MaxAiAction.CheckIsActionDuration();
_targetTime = Time.time + _data.MaxAiAction.Duration;
MainEditor.Instance.OnActionExcuted();
_data.MaxAiAction = null;
AILogicState = AILogicState.Pausing;
}
}
// 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;
// }
// }
}
}
}