using System; using System.Collections.Generic; using TMPro; using UnityEngine; namespace HK.Keyboard { public class Keyboard : MonoBehaviour { public TMP_InputField inputField; public GameObject AlphaBoardUnshifted; public GameObject AlphaBoardShifted; public GameObject NumBoardUnshifted; public GameObject NumBoardShifted; public Keyboard_Chin chin; private List keyBinds; private List keyBinds_Switch; public Action OKAction; public bool isHideOnAwake = false; private bool isChin { get => chin.isChin; set => chin.isChin = value; } private void Awake() { keyBinds = new List(); keyBinds_Switch = new List(); var list = transform.FindChildDeeps(); foreach (var keyBind in list) { keyBinds.Add(keyBind); keyBind.onClickAction += ClickKey; if (keyBind.keyName == "Switch") keyBinds_Switch.Add(keyBind); } isChin = false; inputField.shouldHideSoftKeyboard = true; chin.selectedAction += ClickKey; inputField.onSelect.AddListener((a) => { gameObject.SetActive(true); }); ShowOnlyOne(AlphaBoardUnshifted); if (isHideOnAwake) { gameObject.SetActive(false); } } void ShowOnlyOne(GameObject go) { AlphaBoardUnshifted.SetActive(false); AlphaBoardShifted.SetActive(false); NumBoardUnshifted.SetActive(false); NumBoardShifted.SetActive(false); go.SetActive(true); } [SerializeField] private string tmp_Chin; private void Reset() { tmp_Chin = ""; isChin = false; foreach (var keyBind in keyBinds_Switch) keyBind.GetComponentInChildren().text = "英/中"; ShowOnlyOne(AlphaBoardUnshifted); } void ClickKey(string keyName) { if (CheckKey(keyName)) { if (chin.isChin && !chin.isSelect) { tmp_Chin += keyName; chin.PY(tmp_Chin); inputField.text += keyName; } else { if (!string.IsNullOrEmpty(tmp_Chin)) { var length = inputField.text.Length - tmp_Chin.Length; inputField.text = inputField.text.Remove(length); tmp_Chin = ""; } inputField.text += keyName; } } } bool CheckKey(string keyName) { switch (keyName) { case "Close": OKAction?.Invoke(); // gameObject.SetActive(false); return false; break; case ".?123": ShowOnlyOne(NumBoardUnshifted); return false; break; case "Remove": if (chin.isChin && !chin.isSelect) { if (!string.IsNullOrEmpty(tmp_Chin)) { tmp_Chin = tmp_Chin.Remove(tmp_Chin.Length - 1); chin.PY(tmp_Chin); } } var s = inputField.text; if (s.Length > 0) inputField.text = s.Remove(s.Length - 1); return false; break; case "Lowercase": ShowOnlyOne(AlphaBoardUnshifted); return false; break; case "CapitalLetters": ShowOnlyOne(AlphaBoardShifted); return false; break; case "ABC": ShowOnlyOne(AlphaBoardUnshifted); return false; break; case "!@-": ShowOnlyOne(NumBoardUnshifted); return false; break; case "+/\"": ShowOnlyOne(NumBoardShifted); return false; break; case "OK": OKAction?.Invoke(); return false; break; case "Switch": isChin = !isChin; if (isChin) foreach (var keyBind in keyBinds_Switch) keyBind.GetComponentInChildren().text = "中/英"; else foreach (var keyBind in keyBinds_Switch) keyBind.GetComponentInChildren().text = "英/中"; return false; break; } return true; } public void SetFont(TMP_FontAsset font) { inputField.fontAsset = font; } } }