54 lines
2.3 KiB
C#
54 lines
2.3 KiB
C#
using UnityEngine;
|
|
using BaseGames.Core;
|
|
using BaseGames.Core.Events;
|
|
using BaseGames.World;
|
|
|
|
namespace BaseGames.Challenge
|
|
{
|
|
/// <summary>
|
|
/// 挑战房间入口触发物(架构 22_QuestChallengeModule §13)。
|
|
/// 实现 IInteractable,玩家交互后通过事件频道触发挑战场景加载。
|
|
/// ⚠️ SceneLoader 无 Instance;通过 EVT_SceneLoadRequest 频道触发加载(架构 03 §3)。
|
|
/// </summary>
|
|
[RequireComponent(typeof(Collider2D))]
|
|
public class ChallengeRoomTrigger : MonoBehaviour, IInteractable
|
|
{
|
|
[SerializeField] private ChallengeRoomSO _challengeData;
|
|
[SerializeField] private string _challengeSceneName;
|
|
[SerializeField] private SceneLoadRequestEventChannelSO _onSceneLoadRequest; // EVT_SceneLoadRequest
|
|
|
|
// ── IInteractable ──────────────────────────────────────────────────
|
|
public string InteractPrompt => _challengeData != null
|
|
? $"进入挑战:{_challengeData.displayName}"
|
|
: "进入挑战";
|
|
public bool CanInteract => IsUnlocked();
|
|
|
|
public void Interact(Transform player)
|
|
{
|
|
if (!IsUnlocked()) return;
|
|
_onSceneLoadRequest?.Raise(new SceneLoadRequest
|
|
{
|
|
SceneName = _challengeSceneName,
|
|
EntryTransitionId = string.Empty,
|
|
TransitionType = TransitionType.Scene,
|
|
IsRespawn = false,
|
|
});
|
|
}
|
|
|
|
public void OnPlayerEnterRange(Transform player) { }
|
|
public void OnPlayerExitRange() { }
|
|
|
|
// ── 私有 ─────────────────────────────────────────────────────────
|
|
|
|
private bool IsUnlocked()
|
|
{
|
|
if (_challengeData?.prerequisiteBossIds == null) return true;
|
|
var sm = ServiceLocator.GetOrDefault<ISaveService>();
|
|
if (sm == null) return false;
|
|
foreach (var bossId in _challengeData.prerequisiteBossIds)
|
|
if (!sm.IsBossDefeated(bossId)) return false;
|
|
return true;
|
|
}
|
|
}
|
|
}
|