From bd8e0a4f16b5d85f749554fca780166645f9336f Mon Sep 17 00:00:00 2001 From: Joywayer Date: Mon, 20 Jul 2026 10:36:11 +0800 Subject: [PATCH] =?UTF-8?q?@=20refactor(enemy):=20=5FwallMask=20=E6=9C=AA?= =?UTF-8?q?=E9=85=8D=E6=98=BE=E5=BC=8F=E6=8A=A5=E9=94=99=EF=BC=8C=E4=B8=8D?= =?UTF-8?q?=E5=86=8D=E9=9D=99=E9=BB=98=E5=9B=9E=E9=80=80=E5=9C=B0=E9=9D=A2?= =?UTF-8?q?=E5=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 按 CLAUDE.md §6:删除"_wallMask 为空则回退 _groundMask"的下游兜底(掩盖漏配)。 改为:WouldHitWallAhead/WallAndLedgeCheck 直接用 _wallMask;Awake 校验——启用 墙检测(_wallCheckDist>0)却 _wallMask=Nothing 时 Debug.LogError 提醒策划配置 (推荐 Platform+Wall)。 PlayMode 验证:E001(已配 Platform+Wall)无报错、撞墙检测正常;临时配错的敌人 (wallMask=Nothing) Awake 即报明确错误。 Co-Authored-By: Claude Opus 4.8 (1M context) @ --- Assets/_Game/Scripts/Enemies/EnemyMovement.cs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/Assets/_Game/Scripts/Enemies/EnemyMovement.cs b/Assets/_Game/Scripts/Enemies/EnemyMovement.cs index 03d36d8e..9d4e7483 100644 --- a/Assets/_Game/Scripts/Enemies/EnemyMovement.cs +++ b/Assets/_Game/Scripts/Enemies/EnemyMovement.cs @@ -58,8 +58,9 @@ namespace BaseGames.Enemies [SerializeField] private float _ledgeCheckFwdOffset = 0.1f; [Tooltip("悬崖检测:向下的射线长度;射线未命中地面则 IsLedgeAhead = true(0 = 禁用)")] [SerializeField] private float _ledgeCheckDownDist = 0.4f; - [Tooltip("墙体检测层(巡逻翻边/追击冲刺撞墙判定用,含碰撞体前缘)。策划可按怪配置;" + - "推荐默认 Platform + Wall。留空(Nothing)时回退复用地面层。")] + [Tooltip("墙体检测层(巡逻翻边/追击冲刺撞墙判定用,含碰撞体前缘)。策划必须按怪配置," + + "推荐 Platform + Wall。启用墙检测(_wallCheckDist>0)却留空(Nothing)会在 Awake 报错——" + + "不静默回退地面层,须显式配置。")] [SerializeField] private LayerMask _wallMask; private Rigidbody2D _rb; @@ -246,8 +247,7 @@ namespace BaseGames.Enemies Bounds b = col.bounds; float sign = Mathf.Sign(dir); float edgeX = sign >= 0f ? b.max.x : b.min.x; - LayerMask wallLayer = (_wallMask.value != 0) ? _wallMask : _groundMask; - return Physics2D.Raycast(new Vector2(edgeX, b.center.y), new Vector2(sign, 0f), _wallCheckDist, wallLayer); + return Physics2D.Raycast(new Vector2(edgeX, b.center.y), new Vector2(sign, 0f), _wallCheckDist, _wallMask); } /// 前缘外是否为悬崖(脚边地面缺失,会让碰撞体越出地形边缘)。 @@ -264,14 +264,12 @@ namespace BaseGames.Enemies private void WallAndLedgeCheck() { - LayerMask wallLayer = (_wallMask.value != 0) ? _wallMask : _groundMask; - if (_wallCheckDist > 0f) IsWallAhead = Physics2D.Raycast( GetWallRayOrigin(), new Vector2(_facingDir, 0f), _wallCheckDist, - wallLayer); + _wallMask); if (_ledgeCheckDownDist > 0f) IsLedgeAhead = !Physics2D.Raycast( @@ -284,6 +282,10 @@ namespace BaseGames.Enemies private void Awake() { Debug.Assert(_config != null, "[EnemyMovement] _config 未赋值,请在 Prefab Inspector 中指定 EnemyStatsSO。", this); + // 启用了墙检测却没配 _wallMask → 显式报错,提醒策划正确配置(不静默回退地面层)。 + if (_wallCheckDist > 0f && _wallMask.value == 0) + Debug.LogError($"[EnemyMovement] '{name}' 启用了墙检测(_wallCheckDist>0)但 _wallMask 为 Nothing," + + "撞墙判定将失效(会穿墙)。请在 Inspector 配置墙体层(推荐 Platform + Wall)。", this); _rb = GetComponent(); if (_groundCheckCollider == null) _groundCheckCollider = GetComponent();