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
98 lines
2.7 KiB
3 years ago
|
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;
|
||
|
}
|
||
|
}
|
||
|
}
|