using UnityEngine; using BaseGames.Core; using BaseGames.Localization; using BaseGames.World.Map; namespace BaseGames.UI.Menus { /// /// 地图传送确认控制器(UI 侧桥接)。 /// /// 订阅 :玩家在全屏地图点击一个可传送站点时, /// 弹出 二次确认,确认后调用 /// 发起传送,并按需关闭地图面板。 /// /// /// 放在 UI 程序集(已引用 BaseGames.World.Map)——MapPanel 自身不反向依赖 UI,避免循环引用。 /// 这是"补全传送"闭环的最后一环:地图选点 → 确认 → 传送。 /// /// public class MapTeleportConfirmController : MonoBehaviour { [Header("引用")] [Tooltip("全屏地图面板(订阅其 OnTeleportStationSelected)。")] [SerializeField] private MapPanel _mapPanel; [Tooltip("通用确认框;留空则点击站点后直接传送(无二次确认)。")] [SerializeField] private ConfirmDialogController _confirmDialog; [Header("文案(本地化键)")] [SerializeField] private string _confirmTitleKey = "TELEPORT_CONFIRM_TITLE"; [Tooltip("确认正文前缀本地化键;后面拼接目的地房间显示名。")] [SerializeField] private string _confirmBodyPrefixKey = "TELEPORT_CONFIRM_BODY"; [SerializeField] private string _confirmYesKey = "CONFIRM_YES"; [SerializeField] private string _confirmNoKey = "CONFIRM_NO"; [Header("行为")] [Tooltip("确认传送后是否关闭地图面板(CloseTopPanel)。")] [SerializeField] private bool _closeMapOnConfirm = true; private void OnEnable() { if (_mapPanel != null) _mapPanel.OnTeleportStationSelected += OnStationSelected; } private void OnDisable() { if (_mapPanel != null) _mapPanel.OnTeleportStationSelected -= OnStationSelected; } private void OnStationSelected(string roomId) { if (string.IsNullOrEmpty(roomId)) return; // 无确认框:直接传送 if (_confirmDialog == null) { DoTeleport(roomId); return; } string destName = ResolveDestName(roomId); string prefix = LocalizationManager.Get(_confirmBodyPrefixKey, LocalizationTable.UI); if (string.IsNullOrEmpty(prefix) || prefix == _confirmBodyPrefixKey) prefix = "传送到:"; // 本地化键缺失时的兜底前缀 string body = prefix + destName; // ConfirmDialog 对 body 走 Loc 查找,未命中则原样显示——拼接串可直接呈现; // 确认/取消按钮文案也走本地化键,随语言切换。 _confirmDialog.Show(_confirmTitleKey, body, onConfirm: () => DoTeleport(roomId), onCancel: null, confirmKey: _confirmYesKey, cancelKey: _confirmNoKey); } private void DoTeleport(string roomId) { var teleportSvc = ServiceLocator.GetOrDefault(); if (teleportSvc == null) { Debug.LogWarning("[MapTeleportConfirmController] ITeleportService 未注册,无法传送。"); return; } teleportSvc.RequestTeleport(roomId); if (_closeMapOnConfirm) ServiceLocator.GetOrDefault()?.CloseTopPanel(); } /// 解析目的地房间的玩家可读名(DisplayName 走本地化;无则回退 RoomId)。 private static string ResolveDestName(string roomId) { var room = ServiceLocator.GetOrDefault()?.Database?.GetRoom(roomId); if (room == null || string.IsNullOrEmpty(room.DisplayName)) return roomId; // DisplayName 为本地化 Key 时解析为译文;为普通名称时原样返回(向后兼容)。 return LocalizationManager.Get(room.DisplayName, LocalizationTable.UI); } } }