using System.Collections.Generic; using UnityEngine; namespace BaseGames.World { /// /// 玩家面包屑轨迹追踪器(架构 21_LiquidPuzzleModule §15)。 /// 每 RecordInterval 秒记录一次玩家位置(仅当移动距离超过 MinMoveDistance 时)。 /// 最多保存 MaxCrumbs 个历史位置,超出后移除最旧的。 /// public class BreadcrumbTracker : MonoBehaviour { [SerializeField, Min(0.1f)] private float _recordInterval = 2f; [SerializeField, Min(1)] private int _maxCrumbs = 20; [SerializeField, Min(0.1f)] private float _minMoveDistance = 1f; private readonly Queue _crumbs = new(); private Vector2 _lastPos; private float _timer; private Transform _playerTransform; // ── Unity 生命周期 ──────────────────────────────────────────────── private void Awake() { var go = GameObject.FindWithTag("Player"); if (go != null) _playerTransform = go.transform; } private void Update() { if (_playerTransform == null) return; _timer += Time.deltaTime; if (_timer < _recordInterval) return; _timer = 0f; Vector2 pos = _playerTransform.position; if (_crumbs.Count > 0 && Vector2.Distance(pos, _lastPos) < _minMoveDistance) return; _crumbs.Enqueue(pos); _lastPos = pos; while (_crumbs.Count > _maxCrumbs) _crumbs.Dequeue(); } // ── 公共 API ────────────────────────────────────────────────────── /// 返回最近 count 个面包屑位置(从旧到新排列)。 public IReadOnlyList GetRecentCrumbs(int count) { var result = new List(_crumbs); if (result.Count <= count) return result; return result.GetRange(result.Count - count, count); } /// 清空全部轨迹记录(如死亡后重生时调用)。 public void Clear() => _crumbs.Clear(); } }