From faa210c789eb69eb3134dcf16d2c091caf86eaf0 Mon Sep 17 00:00:00 2001 From: Joywayer Date: Wed, 29 Jul 2026 14:02:13 +0800 Subject: [PATCH] =?UTF-8?q?revert(enemy):=20=E6=94=B6=E6=8E=89=E6=AD=BB?= =?UTF-8?q?=E4=BA=A1=E5=B1=82=E2=80=94=E2=80=94=E6=AD=BB=E4=BA=A1=E5=BD=92?= =?UTF-8?q?=E7=89=A9=E7=90=86=E5=B1=82=EF=BC=8CAI=20=E5=8F=AA=E9=9C=80?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E7=BB=88=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Tests/EditMode/AI/DeathModuleTests.cs | 72 ------------------- .../EditMode/AI/DeathModuleTests.cs.meta | 11 --- .../Enemies/AIBrain/Modules/Death.meta | 8 --- .../AIBrain/Modules/Death/AbilityDeath.cs | 30 -------- .../Modules/Death/AbilityDeath.cs.meta | 11 --- .../AIBrain/Modules/Death/TerminalDeath.cs | 14 ---- .../Modules/Death/TerminalDeath.cs.meta | 11 --- .../AIBrain/Modules/Death/TwoStageDeath.cs | 38 ---------- .../Modules/Death/TwoStageDeath.cs.meta | 11 --- .../Enemies/AIBrain/Modules/IDeathModule.cs | 19 ----- .../AIBrain/Modules/IDeathModule.cs.meta | 11 --- 11 files changed, 236 deletions(-) delete mode 100644 Assets/Tests/EditMode/AI/DeathModuleTests.cs delete mode 100644 Assets/Tests/EditMode/AI/DeathModuleTests.cs.meta delete mode 100644 Assets/_Game/Scripts/Enemies/AIBrain/Modules/Death.meta delete mode 100644 Assets/_Game/Scripts/Enemies/AIBrain/Modules/Death/AbilityDeath.cs delete mode 100644 Assets/_Game/Scripts/Enemies/AIBrain/Modules/Death/AbilityDeath.cs.meta delete mode 100644 Assets/_Game/Scripts/Enemies/AIBrain/Modules/Death/TerminalDeath.cs delete mode 100644 Assets/_Game/Scripts/Enemies/AIBrain/Modules/Death/TerminalDeath.cs.meta delete mode 100644 Assets/_Game/Scripts/Enemies/AIBrain/Modules/Death/TwoStageDeath.cs delete mode 100644 Assets/_Game/Scripts/Enemies/AIBrain/Modules/Death/TwoStageDeath.cs.meta delete mode 100644 Assets/_Game/Scripts/Enemies/AIBrain/Modules/IDeathModule.cs delete mode 100644 Assets/_Game/Scripts/Enemies/AIBrain/Modules/IDeathModule.cs.meta diff --git a/Assets/Tests/EditMode/AI/DeathModuleTests.cs b/Assets/Tests/EditMode/AI/DeathModuleTests.cs deleted file mode 100644 index a7d5fe01..00000000 --- a/Assets/Tests/EditMode/AI/DeathModuleTests.cs +++ /dev/null @@ -1,72 +0,0 @@ -using NUnit.Framework; -using BaseGames.AI; -using BaseGames.Enemies; - -namespace BaseGames.Tests.EditMode.AI -{ - public class DeathModuleTests - { - // 从一个活着的态出发,发 Died 信号进入死亡链。 - static AiRuntime RunWithDeath(IDeathModule m, FakeAiContext ctx) - { - var b = new BrainBuilder(); - AiStateFragments.Locomotion(b, "Alive", LocomotionMode.Patrol); - m.Build(b); - b.Entry("Alive"); - b.Global().To(m.EntryState).OnEvent(AiSignal.Died); - return new AiRuntime(b.Build(), ctx); - } - - [Test] - public void TerminalDeath_EntersAndStays_NoAbility() - { - var ctx = new FakeAiContext(); - var rt = RunWithDeath(new TerminalDeath(), ctx); - rt.Send(AiSignal.Died); - rt.Tick(0.1f); - Assert.AreEqual(TerminalDeath.Death, rt.CurrentStateName); - Assert.AreEqual(0, ctx.C.Used.Count); // 演出走物理状态机,AI 不触发能力 - rt.Tick(0.1f); - Assert.AreEqual(TerminalDeath.Death, rt.CurrentStateName); - } - - [Test] - public void AbilityDeath_TriggersOnce_DoesNotLoop() - { - var ctx = new FakeAiContext(); - var rt = RunWithDeath(new AbilityDeath("die"), ctx); - rt.Send(AiSignal.Died); - rt.Tick(0.1f); - Assert.AreEqual(1, ctx.C.Used.Count); - ctx.C.Running = null; // 演出播完 - rt.Tick(0.1f); rt.Tick(0.1f); - Assert.AreEqual(1, ctx.C.Used.Count); // 不重播 - } - - [Test] - public void TwoStageDeath_PreThenFinal() - { - var ctx = new FakeAiContext(); - var rt = RunWithDeath(new TwoStageDeath("die_pre", "die"), ctx); - rt.Send(AiSignal.Died); - rt.Tick(0.1f); - Assert.AreEqual(TwoStageDeath.DeathPre, rt.CurrentStateName); - CollectionAssert.Contains(ctx.C.Used, "die_pre"); - - rt.Tick(0.1f); - Assert.AreEqual(TwoStageDeath.DeathPre, rt.CurrentStateName); // 前段还在跑 - - ctx.C.Running = null; // 前段结束 - rt.Tick(0.1f); - Assert.AreEqual(TwoStageDeath.Death, rt.CurrentStateName); - CollectionAssert.Contains(ctx.C.Used, "die"); - } - - [Test] - public void AbilityDeath_Build_Throws_WhenAbilityMissing() - { - var b = new BrainBuilder(); - Assert.Throws(() => new AbilityDeath().Build(b)); - } - } -} diff --git a/Assets/Tests/EditMode/AI/DeathModuleTests.cs.meta b/Assets/Tests/EditMode/AI/DeathModuleTests.cs.meta deleted file mode 100644 index 50bbeb5a..00000000 --- a/Assets/Tests/EditMode/AI/DeathModuleTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 444e860b590a7814988a418d9df17c95 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/_Game/Scripts/Enemies/AIBrain/Modules/Death.meta b/Assets/_Game/Scripts/Enemies/AIBrain/Modules/Death.meta deleted file mode 100644 index 243eedf5..00000000 --- a/Assets/_Game/Scripts/Enemies/AIBrain/Modules/Death.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: e1631ed6da4d4c14bb29e845f5065f51 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/_Game/Scripts/Enemies/AIBrain/Modules/Death/AbilityDeath.cs b/Assets/_Game/Scripts/Enemies/AIBrain/Modules/Death/AbilityDeath.cs deleted file mode 100644 index ab08edae..00000000 --- a/Assets/_Game/Scripts/Enemies/AIBrain/Modules/Death/AbilityDeath.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System; -using UnityEngine; -using BaseGames.AI; -using BaseGames.Enemies.Abilities; - -namespace BaseGames.Enemies -{ - /// 单段死亡能力:进入即触发一次,不重播。 - [Serializable] - public sealed class AbilityDeath : IDeathModule - { - public const string Death = "Death"; - - [Tooltip("死亡演出能力")] - [SerializeField] AbilityRef _ability; - - public AbilityDeath() { } - public AbilityDeath(AbilityRef ability) { _ability = ability; } - - public string EntryState => Death; - - public void Build(BrainBuilder b) - { - string id = _ability.Id; - if (string.IsNullOrEmpty(id)) - throw new InvalidOperationException("AbilityDeath:未配置死亡能力。若死亡演出走物理状态机,请改用 TerminalDeath。"); - AiStateFragments.AbilityOnce(b, Death, id); - } - } -} diff --git a/Assets/_Game/Scripts/Enemies/AIBrain/Modules/Death/AbilityDeath.cs.meta b/Assets/_Game/Scripts/Enemies/AIBrain/Modules/Death/AbilityDeath.cs.meta deleted file mode 100644 index 432539b7..00000000 --- a/Assets/_Game/Scripts/Enemies/AIBrain/Modules/Death/AbilityDeath.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 1a3f1cc9d7026a840a01ab2dc951006b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/_Game/Scripts/Enemies/AIBrain/Modules/Death/TerminalDeath.cs b/Assets/_Game/Scripts/Enemies/AIBrain/Modules/Death/TerminalDeath.cs deleted file mode 100644 index ca4fbf0e..00000000 --- a/Assets/_Game/Scripts/Enemies/AIBrain/Modules/Death/TerminalDeath.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using BaseGames.AI; - -namespace BaseGames.Enemies -{ - /// 死亡演出交给物理状态机(EnemyBase.PerformDeath):AI 只需要一个无行为终态。 - [Serializable] - public sealed class TerminalDeath : IDeathModule - { - public const string Death = "Death"; - public string EntryState => Death; - public void Build(BrainBuilder b) => AiStateFragments.Terminal(b, Death); - } -} diff --git a/Assets/_Game/Scripts/Enemies/AIBrain/Modules/Death/TerminalDeath.cs.meta b/Assets/_Game/Scripts/Enemies/AIBrain/Modules/Death/TerminalDeath.cs.meta deleted file mode 100644 index 44188b29..00000000 --- a/Assets/_Game/Scripts/Enemies/AIBrain/Modules/Death/TerminalDeath.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: efb16f225a6b3b846b117409a3dfb620 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/_Game/Scripts/Enemies/AIBrain/Modules/Death/TwoStageDeath.cs b/Assets/_Game/Scripts/Enemies/AIBrain/Modules/Death/TwoStageDeath.cs deleted file mode 100644 index dc49d6e4..00000000 --- a/Assets/_Game/Scripts/Enemies/AIBrain/Modules/Death/TwoStageDeath.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using UnityEngine; -using BaseGames.AI; -using BaseGames.Enemies.Abilities; - -namespace BaseGames.Enemies -{ - /// 两段死亡:前段(挣扎 / 膨胀)播完接后段(爆体,可带生成物)。 - [Serializable] - public sealed class TwoStageDeath : IDeathModule - { - public const string DeathPre = "Death_Pre"; - public const string Death = "Death"; - - [Tooltip("前段演出能力(挣扎 / 膨胀)")] - [SerializeField] AbilityRef _preAbility; - [Tooltip("后段演出能力(爆体 / 生成物)")] - [SerializeField] AbilityRef _ability; - - public TwoStageDeath() { } - public TwoStageDeath(AbilityRef preAbility, AbilityRef ability) - { _preAbility = preAbility; _ability = ability; } - - public string EntryState => DeathPre; - - public void Build(BrainBuilder b) - { - string preId = _preAbility.Id; - string id = _ability.Id; - if (string.IsNullOrEmpty(preId)) throw new InvalidOperationException("TwoStageDeath:未配置前段能力。"); - if (string.IsNullOrEmpty(id)) throw new InvalidOperationException("TwoStageDeath:未配置后段能力。"); - - AiStateFragments.AbilityOnce(b, DeathPre, preId) - .To(Death).When(x => !x.Combat.IsAbilityRunning(preId), "preDone"); - AiStateFragments.AbilityOnce(b, Death, id); - } - } -} diff --git a/Assets/_Game/Scripts/Enemies/AIBrain/Modules/Death/TwoStageDeath.cs.meta b/Assets/_Game/Scripts/Enemies/AIBrain/Modules/Death/TwoStageDeath.cs.meta deleted file mode 100644 index 8ccf2a57..00000000 --- a/Assets/_Game/Scripts/Enemies/AIBrain/Modules/Death/TwoStageDeath.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 0ebca92989544c9449248e635c9a6103 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/_Game/Scripts/Enemies/AIBrain/Modules/IDeathModule.cs b/Assets/_Game/Scripts/Enemies/AIBrain/Modules/IDeathModule.cs deleted file mode 100644 index 3b6871f9..00000000 --- a/Assets/_Game/Scripts/Enemies/AIBrain/Modules/IDeathModule.cs +++ /dev/null @@ -1,19 +0,0 @@ -using BaseGames.AI; - -namespace BaseGames.Enemies -{ - /// - /// 死亡层:单态终结(演出交给物理状态机)/ 单段死亡能力 / 两段演出(可带生成物)。 - /// 骨架只挂一条 Global → EntryState 的 Died 事件边,链条内容全归本模块。 - /// - /// 同 IEngagementModule:骨架只把全局 Died 边指向 EntryState,不在死亡链内部挂边, - /// 故单阶段 Build 足够。 - /// - public interface IDeathModule - { - void Build(BrainBuilder b); - - /// 骨架全局死亡边指向的态。 - string EntryState { get; } - } -} diff --git a/Assets/_Game/Scripts/Enemies/AIBrain/Modules/IDeathModule.cs.meta b/Assets/_Game/Scripts/Enemies/AIBrain/Modules/IDeathModule.cs.meta deleted file mode 100644 index 449f7816..00000000 --- a/Assets/_Game/Scripts/Enemies/AIBrain/Modules/IDeathModule.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: ca95968c577c65244bfb6c5a9a908ef4 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: