using UnityEngine; using BaseGames.Core.Events; using BaseGames.Player; namespace BaseGames.World { /// /// 能力门禁(架构 09_ProgressionModule §2)。 /// 使用 PlayerStats.HasAbility() 检测玩家是否持有所需能力; /// 订阅 AbilityTypeEventChannelSO 实时响应能力解锁事件。 /// [RequireComponent(typeof(Collider2D))] public class AbilityGate : MonoBehaviour { [SerializeField] protected AbilityType _requiredAbility; [SerializeField] private GameObject _blockingObject; // 关卡障碍物 GO(禁/启用) [SerializeField] private GameObject _hintUI; // 提示 UI(能力图标 + "???") [SerializeField] private string _gateId; // 存档用(预留) [Header("引用")] [SerializeField] protected PlayerStats _playerStats; // Inspector 注入 [SerializeField] private AbilityTypeEventChannelSO _onAbilityUnlocked; // EVT_AbilityUnlocked private readonly CompositeDisposable _subs = new(); /// 子类可重写以实现额外通行条件检测。 protected virtual bool EvaluateAccess() => _playerStats != null && _playerStats.HasAbility(_requiredAbility); private void Start() { ApplyState(EvaluateAccess()); } private void OnEnable() { _onAbilityUnlocked?.Subscribe(OnAbilityUnlocked).AddTo(_subs); } private void OnDisable() { _subs.Clear(); } private void OnAbilityUnlocked(AbilityType ability) { if (ability != _requiredAbility) return; ApplyState(true); } /// 外部调用:强制开启门禁(不检查条件)。 public void Open() => ApplyState(true); private void ApplyState(bool unlocked) { if (_blockingObject != null) _blockingObject.SetActive(!unlocked); if (_hintUI != null) _hintUI.SetActive(!unlocked); } } }