using System; using TMPro; using UnityEngine; using UnityEngine.UI; /// /// 输入对话框 /// 用于获取用户输入的通用对话框 // // 弹出输入新密码的对话框 // 使用方法: // InputDialog.Show("重置密码", // $"请为用户 '{username}' 输入新密码:", // "新密码", // (newPassword) => ResetPassword(username, newPassword), // null, true); // 密码模式 /// public class InputDialog : BasePanel { [Header("UI组件")] public TextMeshProUGUI TitleText; public TextMeshProUGUI MessageText; public TMP_InputField InputField; public Button ConfirmButton; public Button CancelButton; // public GameObject DialogPanel; [Header("自定义键盘(可选)")] public GameObject CustomKeyboardPanel; // 自定义键盘面板(如果为空则动态创建) // public TextMeshProUGUI DisplayText; // 显示当前输入的文本 public KeyboardLayout KeyboardType = KeyboardLayout.Default; [Tooltip("如果使用动态键盘,此为键盘面板放置的父物体(例如对话框的主 Panel)")] public Transform KeyboardPanelParent; // 键盘面板的父物体,用于动态创建 private Action _onConfirm; private Action _onCancel; private bool _isPasswordMode; private string _currentInput = ""; // 当前输入内容 private bool _useCustomKeyboard = false; // 是否使用自定义键盘 private CustomKeyboard _dynamicKeyboard; // 运行时创建的键盘脚本 // private static InputDialog _instance; public override void Init() { InitializeButtons(); // HideDialog(); } protected override void Awake() { base.Awake(); } void InitializeButtons() { // 确保对话框初始状态为隐藏 // if (DialogPanel != null) // { // DialogPanel.SetActive(false); // } // 设置按钮事件 if (ConfirmButton != null) { ConfirmButton.onClick.AddListener(OnConfirmClicked); } if (CancelButton != null) { CancelButton.onClick.AddListener(OnCancelClicked); } } /// /// 显示输入对话框 /// /// 标题 /// 消息内容 /// 输入框占位符 /// 确认回调 /// 取消回调 /// 是否为密码模式 public static void Show(string title, string message, string placeholder, Action onConfirm, Action onCancel = null, bool isPasswordMode = false, KeyboardLayout keyboardLayout = KeyboardLayout.Default) { // if (_instance == null) // { // Debug.LogError("InputDialog实例不存在"); // return; // } var dialog = EnhancedUIManager.Instance.ShowPanel(UIPanelType.Dialog, true, false); if(dialog != null) dialog.ShowDialog(title, message, placeholder, onConfirm, onCancel, isPasswordMode, keyboardLayout); else Debug.LogError("Failed to create InputDialog!"); } private void ShowDialog(string title, string message, string placeholder, Action onConfirm, Action onCancel, bool isPasswordMode, KeyboardLayout keyboardLayout) { _onConfirm = onConfirm; _onCancel = onCancel; _isPasswordMode = isPasswordMode; _currentInput = placeholder ?? ""; // 设置文本 if (TitleText != null) TitleText.text = title; if (MessageText != null) MessageText.text = message; // 通用策略:如果配置了 CustomKeyboardPanel 则使用自定义键盘(跨平台),避免调出系统键盘 // 如果 CustomKeyboardPanel 为空但 KeyboardPanelParent 已指定,则动态创建键盘 if (CustomKeyboardPanel == null && KeyboardPanelParent != null) { CustomKeyboardPanel = CreateDynamicKeyboard(); } _useCustomKeyboard = CustomKeyboardPanel != null; if (_useCustomKeyboard) { // 显示自定义键盘区域 CustomKeyboardPanel.SetActive(true); // 完全禁用 InputField 的交互以避免系统键盘 if (InputField != null) { InputField.gameObject.SetActive(true); InputField.shouldHideMobileInput = true; InputField.readOnly = true; // 禁用系统输入 InputField.interactable = false; // 禁用交互,避免触发系统键盘 InputField.text = _currentInput; if (InputField.placeholder != null) InputField.placeholder.GetComponent().text = placeholder; // 不调用 ActivateInputField() } // if (DisplayText != null) // { // DisplayText.text = isPasswordMode ? new string('*', _currentInput.Length) : _currentInput; // DisplayText.gameObject.SetActive(true); // } // 初始化 CustomKeyboard 脚本并绑定目标 var ck = CustomKeyboardPanel.GetComponent(); if (ck == null) ck = _dynamicKeyboard; if (ck != null) { ck.SetTarget(this, keyboardLayout, isPasswordMode); } } else { // 使用系统/内置 Unity 输入框,但隐藏移动端默认输入(如果需要)并激活输入框 if (CustomKeyboardPanel != null) CustomKeyboardPanel.SetActive(false); if (InputField != null) { InputField.gameObject.SetActive(true); InputField.shouldHideMobileInput = true; InputField.readOnly = false; InputField.text = _currentInput; if (InputField.placeholder != null) InputField.placeholder.GetComponent().text = placeholder; InputField.contentType = isPasswordMode ? TMP_InputField.ContentType.Password : TMP_InputField.ContentType.Standard; InputField.ActivateInputField(); } } } /// /// 动态创建键盘面板(包含 CustomKeyboard 脚本、GridLayoutGroup 和容器) /// private GameObject CreateDynamicKeyboard() { // 创建键盘面板 GameObject var panelGO = new GameObject("DynamicKeyboardPanel", typeof(RectTransform)); panelGO.transform.SetParent(KeyboardPanelParent, false); var panelRT = panelGO.GetComponent(); // 设置大小和位置(可根据需要调整) panelRT.sizeDelta = new Vector2(1050, 300); panelRT.anchoredPosition = new Vector2(50, 0); // 添加 Image 以显示背景(可选) var panelImg = panelGO.AddComponent(); panelImg.color = new Color(0.08f, 0.1f, 0.12f, 0.95f); // 深色背景 // 创建容器(用于 GridLayoutGroup) var containerGO = new GameObject("KeysContainer", typeof(RectTransform)); containerGO.transform.SetParent(panelGO.transform, false); var containerRT = containerGO.GetComponent(); containerRT.anchorMin = Vector2.zero; containerRT.anchorMax = Vector2.one; containerRT.offsetMin = new Vector2(10, 10); containerRT.offsetMax = new Vector2(-10, -10); // 添加 GridLayoutGroup var grid = containerGO.AddComponent(); grid.cellSize = new Vector2(60, 60); grid.spacing = new Vector2(6, 6); // 添加 LayoutElement 以确保 container 大小正确 var containerLE = containerGO.AddComponent(); containerLE.preferredWidth = 400; containerLE.preferredHeight = 300; // 添加 CustomKeyboard 脚本 _dynamicKeyboard = panelGO.AddComponent(); _dynamicKeyboard.KeysContainer = containerGO.transform; _dynamicKeyboard.KeySize = new Vector2(60, 60); _dynamicKeyboard.KeySpacing = new Vector2(6, 6); return panelGO; } private void OnConfirmClicked() { // 统一使用 _currentInput,因为自定义键盘和 InputField 都已同步 string inputValue = _useCustomKeyboard ? _currentInput : (InputField?.text ?? ""); _onConfirm?.Invoke(inputValue); HideDialog(); } private void OnCancelClicked() { _onCancel?.Invoke(); HideDialog(); } private void HideDialog() { // 清理动态创建的键盘 if (_dynamicKeyboard != null && CustomKeyboardPanel != null) { Destroy(CustomKeyboardPanel); CustomKeyboardPanel = null; _dynamicKeyboard = null; } EnhancedUIManager.Instance.HidePanel(true); _onConfirm = null; _onCancel = null; _currentInput = ""; } #region 自定义键盘支持方法 /// /// 添加字符到输入内容 /// 供自定义键盘按钮调用 /// public void OnKeyPressed(string key) { if (string.IsNullOrEmpty(key)) return; _currentInput += key; // 同步更新 InputField(即使是只读模式,也可以通过代码修改) if (InputField != null) { InputField.text = _currentInput; } // UpdateDisplay(); } /// /// 删除最后一个字符 /// public void OnBackspacePressed() { if (_currentInput.Length > 0) { _currentInput = _currentInput.Substring(0, _currentInput.Length - 1); // 同步更新 InputField if (InputField != null) { InputField.text = _currentInput; } // UpdateDisplay(); } } /// /// 清空输入 /// public void OnClearPressed() { _currentInput = ""; // 同步更新 InputField if (InputField != null) { InputField.text = _currentInput; } // UpdateDisplay(); } /// /// 更新显示文本 /// // private void UpdateDisplay() // { // if (_useCustomKeyboard && DisplayText != null) // { // if (_isPasswordMode) // { // // 密码模式显示星号 // DisplayText.text = new string('*', _currentInput.Length); // } // else // { // DisplayText.text = _currentInput; // } // } // } #endregion }