diff --git a/Assets/_Game/Scripts/AI/IActorVitals.cs b/Assets/_Game/Scripts/AI/IActorVitals.cs
new file mode 100644
index 00000000..841f1d89
--- /dev/null
+++ b/Assets/_Game/Scripts/AI/IActorVitals.cs
@@ -0,0 +1,12 @@
+namespace BaseGames.AI
+{
+ /// 生命体征/受控状态接口(第 3 阶段由 VitalsAdapter 适配敌人状态)。
+ public interface IActorVitals
+ {
+ bool IsAlive { get; }
+ /// 物理态是否为 Controlled——决策层仅在此为真时推进(IsControllable 让位门)。
+ bool IsControllable { get; }
+ float HpPercent { get; }
+ bool HpBelow(float ratio);
+ }
+}
diff --git a/Assets/_Game/Scripts/AI/IActorVitals.cs.meta b/Assets/_Game/Scripts/AI/IActorVitals.cs.meta
new file mode 100644
index 00000000..1a913730
--- /dev/null
+++ b/Assets/_Game/Scripts/AI/IActorVitals.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 9add25f798610d346ad9d65d50775eb4
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/_Game/Scripts/AI/IAiContext.cs b/Assets/_Game/Scripts/AI/IAiContext.cs
new file mode 100644
index 00000000..b96040fc
--- /dev/null
+++ b/Assets/_Game/Scripts/AI/IAiContext.cs
@@ -0,0 +1,15 @@
+namespace BaseGames.AI
+{
+ ///
+ /// 传给所有状态回调 / 转换条件的上下文。声明层的 lambda 只能通过它访问实例,
+ /// 不得闭包捕获具体敌人——这是 lambda 挂在共享 AiGraph 上的前提。
+ ///
+ public interface IAiContext
+ {
+ ISensor Sensor { get; }
+ IMover Mover { get; }
+ ICombatant Combat { get; }
+ IActorVitals Vitals { get; }
+ Blackboard Blackboard { get; }
+ }
+}
diff --git a/Assets/_Game/Scripts/AI/IAiContext.cs.meta b/Assets/_Game/Scripts/AI/IAiContext.cs.meta
new file mode 100644
index 00000000..6fabd5bd
--- /dev/null
+++ b/Assets/_Game/Scripts/AI/IAiContext.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: b8fe3f9806c1f644ea3da6d244181b98
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/_Game/Scripts/AI/ICombatant.cs b/Assets/_Game/Scripts/AI/ICombatant.cs
new file mode 100644
index 00000000..bc60eab0
--- /dev/null
+++ b/Assets/_Game/Scripts/AI/ICombatant.cs
@@ -0,0 +1,11 @@
+namespace BaseGames.AI
+{
+ /// 战斗/能力调度接口(第 3 阶段由 CombatantAdapter 适配能力注册表)。
+ public interface ICombatant
+ {
+ bool UseAbility(string abilityId);
+ bool IsAbilityRunning(string abilityId = null); // null = 任意能力
+ bool NoAbilityRunning { get; }
+ bool CanUseAbility(string abilityId);
+ }
+}
diff --git a/Assets/_Game/Scripts/AI/ICombatant.cs.meta b/Assets/_Game/Scripts/AI/ICombatant.cs.meta
new file mode 100644
index 00000000..233b60e8
--- /dev/null
+++ b/Assets/_Game/Scripts/AI/ICombatant.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: b61b9cf2b94d7ab4c8e16be8cfc19e8d
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/_Game/Scripts/AI/IMover.cs b/Assets/_Game/Scripts/AI/IMover.cs
new file mode 100644
index 00000000..1f6f4d13
--- /dev/null
+++ b/Assets/_Game/Scripts/AI/IMover.cs
@@ -0,0 +1,14 @@
+using UnityEngine;
+
+namespace BaseGames.AI
+{
+ /// 移动能力接口(第 3 阶段由 MoverAdapter 适配移动系统)。
+ public interface IMover
+ {
+ void MoveTo(Vector2 target);
+ void FacePlayer();
+ void Stop();
+ void WalkRandom();
+ void LookAround();
+ }
+}
diff --git a/Assets/_Game/Scripts/AI/IMover.cs.meta b/Assets/_Game/Scripts/AI/IMover.cs.meta
new file mode 100644
index 00000000..9d6f4070
--- /dev/null
+++ b/Assets/_Game/Scripts/AI/IMover.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: bfa62d8e02c8fa644b4c18929b82cbcb
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/_Game/Scripts/AI/ISensor.cs b/Assets/_Game/Scripts/AI/ISensor.cs
new file mode 100644
index 00000000..7cf45932
--- /dev/null
+++ b/Assets/_Game/Scripts/AI/ISensor.cs
@@ -0,0 +1,13 @@
+using UnityEngine;
+
+namespace BaseGames.AI
+{
+ /// 感知能力接口(第 3 阶段由 SensorAdapter 适配感知系统)。
+ public interface ISensor
+ {
+ bool SeesPlayer();
+ bool InRange(float range); // 内部用平方距离比较
+ bool LostFor(float seconds); // 丢失玩家已持续 seconds
+ Vector2 LastKnown { get; }
+ }
+}
diff --git a/Assets/_Game/Scripts/AI/ISensor.cs.meta b/Assets/_Game/Scripts/AI/ISensor.cs.meta
new file mode 100644
index 00000000..03ddb8ae
--- /dev/null
+++ b/Assets/_Game/Scripts/AI/ISensor.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 1e1f4a0222db1794ca4f8ef54b5db3b6
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant: