CTT/Unity/Assets/Hotfix/Module/AI/AIComponentSystem.cs

81 lines
2.3 KiB
C#
Raw Normal View History

using System;
using Cal.DataTable;
using UnityEngine;
namespace ET
{
[ObjectSystem]
public class AIComponentAwakeSystem: AwakeSystem<AIComponent, int>
{
public override void Awake(AIComponent self, int aiConfigId)
{
self.AIConfigId = aiConfigId;
self.Timer = TimerComponent.Instance.NewRepeatedTimer(1000, self.Check);
}
}
[ObjectSystem]
public class AIComponentDestroySystem: DestroySystem<AIComponent>
{
public override void Destroy(AIComponent self)
{
TimerComponent.Instance.Remove(ref self.Timer);
self.CancellationToken?.Cancel();
self.CancellationToken = null;
self.Current = 0;
}
}
public static class AIComponentSystem
{
public static void Check(this AIComponent self)
{
if (self.Parent == null)
{
TimerComponent.Instance.Remove(ref self.Timer);
return;
}
var oneAI = AIConfigCategory.Instance .GetAI(self.AIConfigId);
foreach (AIConfig aiConfig in oneAI.Values)
{
AIDispatcherComponent.Instance.AIHandlers.TryGetValue(aiConfig.Name, out AAIHandler aaiHandler);
if (aaiHandler == null)
{
Log.Error($"not found aihandler: {aiConfig.Name}");
continue;
}
int ret = aaiHandler.Check(self, aiConfig);
if (ret != 0)
{
continue;
}
if (self.Current == aiConfig.Id)
{
break;
}
self.Cancel(); // 取消之前的行为
ETCancellationToken cancellationToken = new ETCancellationToken();
self.CancellationToken = cancellationToken;
self.Current = aiConfig.Id;
aaiHandler.Execute(self, aiConfig, cancellationToken).Coroutine();
return;
}
}
private static void Cancel(this AIComponent self)
{
self.CancellationToken?.Cancel();
self.Current = 0;
self.CancellationToken = null;
}
}
}