fix(world): 检查点标记闩锁随接触周期重置——折返重经标记可覆盖注册

CheckpointMarker._isActivated 此前一次性置位,玩家折返重新经过
早先的标记不会再注册,"最近经过的为准"对回头路失效。改为
OnTriggerExit2D 重置闩锁:每次重新进入触发区都覆盖注册最近
检查点,同一次接触内仍只注册/广播一次。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-06-12 11:16:08 +08:00
parent 613f93c13e
commit 01787e9c34

View File

@@ -9,9 +9,10 @@ namespace BaseGames.World
/// 玩家经过时自动激活,成为 LethalTrap 回溯的目标位置。
///
/// 设计要点:
/// - 同一房间可放置多个,取最近经过的一个
/// - 同一房间可放置多个,取最近经过的一个(折返重新经过早先的标记同样覆盖注册)
/// - 激活状态仅存于运行时,不持久化,换房间后重置
/// - 每个 CheckpointMarker 仅激活一次(重复进入同一触发区无效)
/// - 闩锁按接触周期:进入时注册并广播一次,离开触发区后重置,
/// 同一次接触内不重复结算
/// </summary>
[RequireComponent(typeof(Collider2D))]
public class CheckpointMarker : MonoBehaviour
@@ -26,7 +27,7 @@ namespace BaseGames.World
private bool _isActivated;
/// <summary>当前运行时是否已被激活。</summary>
/// <summary>本次接触是否已注册过(玩家离开触发区后重置)。</summary>
public bool IsActivated => _isActivated;
private void Awake()
@@ -49,6 +50,12 @@ namespace BaseGames.World
_onCheckpointReached?.Raise();
}
private void OnTriggerExit2D(Collider2D other)
{
if ((_playerLayers.value & (1 << other.gameObject.layer)) == 0) return;
_isActivated = false;
}
private void OnDrawGizmos()
{
Gizmos.color = _isActivated