多轮审查和修复

This commit is contained in:
2026-05-12 15:34:08 +08:00
parent f55d2a57c3
commit ebbbb7332e
805 changed files with 838724 additions and 1905 deletions

View File

@@ -0,0 +1,60 @@
using UnityEngine;
using BaseGames.Core.Events;
using BaseGames.Player;
namespace BaseGames.World
{
/// <summary>
/// 能力门禁(架构 09_ProgressionModule §2
/// 使用 PlayerStats.HasAbility() 检测玩家是否持有所需能力;
/// 订阅 AbilityTypeEventChannelSO 实时响应能力解锁事件。
/// </summary>
[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();
/// <summary>子类可重写以实现额外通行条件检测。</summary>
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);
}
/// <summary>外部调用:强制开启门禁(不检查条件)。</summary>
public void Open() => ApplyState(true);
private void ApplyState(bool unlocked)
{
if (_blockingObject != null) _blockingObject.SetActive(!unlocked);
if (_hintUI != null) _hintUI.SetActive(!unlocked);
}
}
}