From 88fca8f9b0b23c5d4f30e3ce35aa252853f30774 Mon Sep 17 00:00:00 2001 From: Joywayer Date: Mon, 20 Jul 2026 10:32:07 +0800 Subject: [PATCH] =?UTF-8?q?@=20fix(enemy):=20=E6=92=9E=E5=A2=99=E6=A3=80?= =?UTF-8?q?=E6=B5=8B=E5=B1=82=E9=BB=98=E8=AE=A4=20Platform+Wall(=E7=AD=96?= =?UTF-8?q?=E5=88=92=E5=8F=AF=E9=85=8D)=20+=20=E4=BF=AE=20Physics2D=20?= =?UTF-8?q?=E5=B1=82=E7=9F=A9=E9=98=B5=E8=90=BD=E7=9B=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - EnemyMovement._wallMask:本就 [SerializeField] 暴露在 Inspector,补 Tooltip 说明为策划可配的撞墙检测层(巡逻翻边/追击冲刺共用,按碰撞体前缘);脚手架 PlaceE001 默认赋 Platform+Wall,prefab 同步。原先 Nothing→回退 groundMask, 漏检 Wall 层墙;现显式含 Wall。回退逻辑保留作未配置兜底。 - Physics2DLayerReport.SavePhysicsSettings:原实现(AssetDatabase.SaveAssets+ 改 defaultContactOffset)不落盘层矩阵——实测 Physics2D.IgnoreLayerCollision 的 改动 SaveToSerializedFileAndForget(单例) 也捕获不到;改用 File/Save Project (实测 hash 变化确认落盘,且不触动打开场景)。Auto Fix 的矩阵修正现能立即持久化。 (说明:Enemy×Player 碰撞矩阵与报告 ExpectedPairs 此前已正确=忽略,无需改动; 地图障碍物层管理/冲刺可穿透障碍另行整体规划。) Co-Authored-By: Claude Opus 4.8 (1M context) @ --- Assets/_Game/Prefabs/Enemies/E001/ENM_CaoZhi.prefab | 2 +- .../Scripts/Editor/Scene/SceneObjectPlacerTool.cs | 1 + .../Scripts/Editor/Tools/Physics2DLayerReport.cs | 13 +++++++------ Assets/_Game/Scripts/Enemies/EnemyMovement.cs | 3 ++- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/Assets/_Game/Prefabs/Enemies/E001/ENM_CaoZhi.prefab b/Assets/_Game/Prefabs/Enemies/E001/ENM_CaoZhi.prefab index b15479df..e88ca626 100644 --- a/Assets/_Game/Prefabs/Enemies/E001/ENM_CaoZhi.prefab +++ b/Assets/_Game/Prefabs/Enemies/E001/ENM_CaoZhi.prefab @@ -344,7 +344,7 @@ MonoBehaviour: _ledgeCheckDownDist: 0.4 _wallMask: serializedVersion: 2 - m_Bits: 0 + m_Bits: 8388864 _dbg_FacingDirection: 0 _dbg_VelocityX: 0 _dbg_VelocityY: 0 diff --git a/Assets/_Game/Scripts/Editor/Scene/SceneObjectPlacerTool.cs b/Assets/_Game/Scripts/Editor/Scene/SceneObjectPlacerTool.cs index 30933ee7..f4ed8ead 100644 --- a/Assets/_Game/Scripts/Editor/Scene/SceneObjectPlacerTool.cs +++ b/Assets/_Game/Scripts/Editor/Scene/SceneObjectPlacerTool.cs @@ -517,6 +517,7 @@ namespace BaseGames.Editor AssignLayerMask(movement, "_groundMask", new[] { "Platform", "OneWayPlatform", "MovingOneWayPlatform", "MidHeightOneWayPlatform" }, report); + AssignLayerMask(movement, "_wallMask", new[] { "Platform", "Wall" }, report); // 撞墙判定层(策划可调) AssignAsset(chaseAbility, "_config", report, false, "ABL_E001_Chase"); AssignReference(chaseAbility, "_contactDamage", bodyContact, report); diff --git a/Assets/_Game/Scripts/Editor/Tools/Physics2DLayerReport.cs b/Assets/_Game/Scripts/Editor/Tools/Physics2DLayerReport.cs index 721f794a..6ab94370 100644 --- a/Assets/_Game/Scripts/Editor/Tools/Physics2DLayerReport.cs +++ b/Assets/_Game/Scripts/Editor/Tools/Physics2DLayerReport.cs @@ -201,15 +201,16 @@ namespace BaseGames.Editor } /// - /// 通过 SerializedObject 修改 ProjectSettings/Physics2DSettings.asset 以持久化 Physics2D 层矩阵。 - /// Unity 在退出时也会自动保存,但显式调用可立即落盘。 + /// 立即把 Physics2D 层碰撞矩阵改动落盘到 ProjectSettings/Physics2DSettings.asset。 + /// 只改内存态,Unity 默认要等编辑器退出/进 Play/手动 + /// Save Project 才持久化。经实测:SaveToSerializedFileAndForget(单例) 不会捕获运行时 IgnoreLayerCollision + /// 的改动;Save Project 会(且不触动打开的场景)。故此处触发 Save Project 强制落盘。 /// private static void SavePhysicsSettings() { - // Unity 内部会在下一次 AssetDatabase 刷新时持久化 Physics2D 设置 - // 使用 Physics2DLayerMatrix 写入后刷新即可 - AssetDatabase.SaveAssets(); - Physics2D.defaultContactOffset = Physics2D.defaultContactOffset; // 强制标记 dirty + if (!EditorApplication.ExecuteMenuItem("File/Save Project")) + Debug.LogWarning("[Physics2DLayerReport] Save Project 执行失败,层矩阵改动未立即落盘" + + "(Unity 仍会在退出/进 Play 时保存)。"); } // ── 内部数据结构 ───────────────────────────────────────────────────── diff --git a/Assets/_Game/Scripts/Enemies/EnemyMovement.cs b/Assets/_Game/Scripts/Enemies/EnemyMovement.cs index d6125847..03d36d8e 100644 --- a/Assets/_Game/Scripts/Enemies/EnemyMovement.cs +++ b/Assets/_Game/Scripts/Enemies/EnemyMovement.cs @@ -58,7 +58,8 @@ namespace BaseGames.Enemies [SerializeField] private float _ledgeCheckFwdOffset = 0.1f; [Tooltip("悬崖检测:向下的射线长度;射线未命中地面则 IsLedgeAhead = true(0 = 禁用)")] [SerializeField] private float _ledgeCheckDownDist = 0.4f; - [Tooltip("墙体层 LayerMask;留空时复用地面 LayerMask")] + [Tooltip("墙体检测层(巡逻翻边/追击冲刺撞墙判定用,含碰撞体前缘)。策划可按怪配置;" + + "推荐默认 Platform + Wall。留空(Nothing)时回退复用地面层。")] [SerializeField] private LayerMask _wallMask; private Rigidbody2D _rb;