From 7281c5cf6ef41cb4f34880ac325c21bd5c14449d Mon Sep 17 00:00:00 2001 From: Joywayer Date: Fri, 3 Jul 2026 13:58:52 +0800 Subject: [PATCH] =?UTF-8?q?feat(ai):=20BrainGraph=20=E8=83=BD=E5=8A=9B?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3(ISensor/IMover/ICombatant/IActorVitals)+IAiC?= =?UTF-8?q?ontext?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/_Game/Scripts/AI/IActorVitals.cs | 12 ++++++++++++ Assets/_Game/Scripts/AI/IActorVitals.cs.meta | 11 +++++++++++ Assets/_Game/Scripts/AI/IAiContext.cs | 15 +++++++++++++++ Assets/_Game/Scripts/AI/IAiContext.cs.meta | 11 +++++++++++ Assets/_Game/Scripts/AI/ICombatant.cs | 11 +++++++++++ Assets/_Game/Scripts/AI/ICombatant.cs.meta | 11 +++++++++++ Assets/_Game/Scripts/AI/IMover.cs | 14 ++++++++++++++ Assets/_Game/Scripts/AI/IMover.cs.meta | 11 +++++++++++ Assets/_Game/Scripts/AI/ISensor.cs | 13 +++++++++++++ Assets/_Game/Scripts/AI/ISensor.cs.meta | 11 +++++++++++ 10 files changed, 120 insertions(+) create mode 100644 Assets/_Game/Scripts/AI/IActorVitals.cs create mode 100644 Assets/_Game/Scripts/AI/IActorVitals.cs.meta create mode 100644 Assets/_Game/Scripts/AI/IAiContext.cs create mode 100644 Assets/_Game/Scripts/AI/IAiContext.cs.meta create mode 100644 Assets/_Game/Scripts/AI/ICombatant.cs create mode 100644 Assets/_Game/Scripts/AI/ICombatant.cs.meta create mode 100644 Assets/_Game/Scripts/AI/IMover.cs create mode 100644 Assets/_Game/Scripts/AI/IMover.cs.meta create mode 100644 Assets/_Game/Scripts/AI/ISensor.cs create mode 100644 Assets/_Game/Scripts/AI/ISensor.cs.meta 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: