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
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; |
|
} |
|
} |
|
} |