@
refactor(enemy): _wallMask 未配显式报错,不再静默回退地面层 按 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) <noreply@anthropic.com> @
This commit is contained in:
@@ -58,8 +58,9 @@ namespace BaseGames.Enemies
|
|||||||
[SerializeField] private float _ledgeCheckFwdOffset = 0.1f;
|
[SerializeField] private float _ledgeCheckFwdOffset = 0.1f;
|
||||||
[Tooltip("悬崖检测:向下的射线长度;射线未命中地面则 IsLedgeAhead = true(0 = 禁用)")]
|
[Tooltip("悬崖检测:向下的射线长度;射线未命中地面则 IsLedgeAhead = true(0 = 禁用)")]
|
||||||
[SerializeField] private float _ledgeCheckDownDist = 0.4f;
|
[SerializeField] private float _ledgeCheckDownDist = 0.4f;
|
||||||
[Tooltip("墙体检测层(巡逻翻边/追击冲刺撞墙判定用,含碰撞体前缘)。策划可按怪配置;" +
|
[Tooltip("墙体检测层(巡逻翻边/追击冲刺撞墙判定用,含碰撞体前缘)。策划必须按怪配置," +
|
||||||
"推荐默认 Platform + Wall。留空(Nothing)时回退复用地面层。")]
|
"推荐 Platform + Wall。启用墙检测(_wallCheckDist>0)却留空(Nothing)会在 Awake 报错——" +
|
||||||
|
"不静默回退地面层,须显式配置。")]
|
||||||
[SerializeField] private LayerMask _wallMask;
|
[SerializeField] private LayerMask _wallMask;
|
||||||
|
|
||||||
private Rigidbody2D _rb;
|
private Rigidbody2D _rb;
|
||||||
@@ -246,8 +247,7 @@ namespace BaseGames.Enemies
|
|||||||
Bounds b = col.bounds;
|
Bounds b = col.bounds;
|
||||||
float sign = Mathf.Sign(dir);
|
float sign = Mathf.Sign(dir);
|
||||||
float edgeX = sign >= 0f ? b.max.x : b.min.x;
|
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, _wallMask);
|
||||||
return Physics2D.Raycast(new Vector2(edgeX, b.center.y), new Vector2(sign, 0f), _wallCheckDist, wallLayer);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>朝 <paramref name="dir"/> 前缘外是否为悬崖(脚边地面缺失,会让碰撞体越出地形边缘)。</summary>
|
/// <summary>朝 <paramref name="dir"/> 前缘外是否为悬崖(脚边地面缺失,会让碰撞体越出地形边缘)。</summary>
|
||||||
@@ -264,14 +264,12 @@ namespace BaseGames.Enemies
|
|||||||
|
|
||||||
private void WallAndLedgeCheck()
|
private void WallAndLedgeCheck()
|
||||||
{
|
{
|
||||||
LayerMask wallLayer = (_wallMask.value != 0) ? _wallMask : _groundMask;
|
|
||||||
|
|
||||||
if (_wallCheckDist > 0f)
|
if (_wallCheckDist > 0f)
|
||||||
IsWallAhead = Physics2D.Raycast(
|
IsWallAhead = Physics2D.Raycast(
|
||||||
GetWallRayOrigin(),
|
GetWallRayOrigin(),
|
||||||
new Vector2(_facingDir, 0f),
|
new Vector2(_facingDir, 0f),
|
||||||
_wallCheckDist,
|
_wallCheckDist,
|
||||||
wallLayer);
|
_wallMask);
|
||||||
|
|
||||||
if (_ledgeCheckDownDist > 0f)
|
if (_ledgeCheckDownDist > 0f)
|
||||||
IsLedgeAhead = !Physics2D.Raycast(
|
IsLedgeAhead = !Physics2D.Raycast(
|
||||||
@@ -284,6 +282,10 @@ namespace BaseGames.Enemies
|
|||||||
private void Awake()
|
private void Awake()
|
||||||
{
|
{
|
||||||
Debug.Assert(_config != null, "[EnemyMovement] _config 未赋值,请在 Prefab Inspector 中指定 EnemyStatsSO。", this);
|
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<Rigidbody2D>();
|
_rb = GetComponent<Rigidbody2D>();
|
||||||
if (_groundCheckCollider == null)
|
if (_groundCheckCollider == null)
|
||||||
_groundCheckCollider = GetComponent<Collider2D>();
|
_groundCheckCollider = GetComponent<Collider2D>();
|
||||||
|
|||||||
Reference in New Issue
Block a user