Files
zeling_v2/Assets/_Game/Scripts/Quest/ChallengeRoomTrigger.cs

55 lines
2.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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,
ShowLoadingScreen = false,
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;
}
}
}