#if UNITY_EDITOR
using UnityEditor;
using UnityEngine;
using BaseGames.Core;
using BaseGames.Core.Assets;
using BaseGames.Core.Events;
namespace BaseGames.Editor.Debugging
{
///
/// 调试入口:绕过尚在开发中的「新游戏 / 存档槽 / 模式选择」UI,
/// 直接加载首关(,当前映射到 TestRoomA)并生成玩家,
/// 便于在编辑器中快速验证游戏内系统(如地图)。
///
/// 复刻 DataDrivenMainMenuController.HandleSlotConfirmed 的核心动作:建立内存存档 + 发场景过渡请求。
/// 仅在 Play 模式可用。
///
/// 菜单:BaseGames ▸ Debug ▸ Enter First Room (Play)
///
public static class DebugEnterTestRoom
{
private const string MenuPath = "BaseGames/Debug/Enter First Room (Play)";
[MenuItem(MenuPath, priority = 900)]
public static void EnterFirstRoom()
{
if (!Application.isPlaying)
{
Debug.LogWarning("[Debug] 请先进入 Play 模式再使用此入口。");
return;
}
var save = ServiceLocator.GetOrDefault();
if (save != null && !save.HasSave(0))
save.CreateSlot(0, false); // 建立内存存档,确保新游戏初始状态
// 必须经事件频道 EVT_SceneLoadRequest 发请求:SceneService 据此加载场景,
// GameManager 据此驱动状态机 LoadingScene → Gameplay(HUD/小地图随之显示)。
// 直接调 ISceneService.RequestTransition 会绕过 GameManager 状态机,导致停留在 MainMenu、HUD 隐藏。
var channel = FindSceneLoadChannel();
if (channel == null)
{
Debug.LogError("[Debug] 未找到 EVT_SceneLoadRequest(SceneLoadRequestEventChannelSO)资产。");
return;
}
channel.Raise(new SceneLoadRequest
{
SceneName = AddressKeys.SceneGameChapter1, // 当前映射到 TestRoomA
EntryTransitionId = null, // 默认出生点
TransitionType = TransitionType.Scene,
IsRespawn = false,
});
Debug.Log($"[Debug] 已经事件频道请求加载首关 '{AddressKeys.SceneGameChapter1}',将走 LoadingScene → Gameplay。");
}
/// 加载 EVT_SceneLoadRequest 频道资产(与 GameManager/SceneService 共享同一实例)。
private static SceneLoadRequestEventChannelSO FindSceneLoadChannel()
{
foreach (var guid in AssetDatabase.FindAssets("t:SceneLoadRequestEventChannelSO"))
{
var path = AssetDatabase.GUIDToAssetPath(guid);
var asset = AssetDatabase.LoadAssetAtPath(path);
if (asset != null && asset.name == "EVT_SceneLoadRequest") return asset;
}
// 回退:任意同类型频道
foreach (var guid in AssetDatabase.FindAssets("t:SceneLoadRequestEventChannelSO"))
{
var asset = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(guid));
if (asset != null) return asset;
}
return null;
}
[MenuItem(MenuPath, validate = true)]
private static bool Validate() => Application.isPlaying;
}
}
#endif