You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

98 lines
2.7 KiB

using System;
using UnityEngine;
namespace ET
{
[Timer(TimerType.AITimer)]
public class AITimer: ATimer<AIComponent>
{
public override void Run(AIComponent self)
{
try
{
self.Check();
}
catch (Exception e)
{
Log.Error($"move timer error: {self.Id}\n{e}");
}
}
}
[ObjectSystem]
public class AIComponentAwakeSystem: AwakeSystem<AIComponent, int>
{
public override void Awake(AIComponent self, int aiConfigId)
{
self.AIConfigId = aiConfigId;
self.Timer = TimerComponent.Instance.NewRepeatedTimer(1000, TimerType.AITimer, self);
}
}
[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;
}
}
[FriendClass(typeof(AIComponent))]
[FriendClass(typeof(AIDispatcherComponent))]
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.AIConfigs[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;
}
}
}