FM/Assets/Scripts/Base/Keyboard/Keyboard.cs

209 lines
6.4 KiB
C#
Raw Normal View History

2025-06-04 22:49:37 +08:00
using System;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using ZGame;
2025-06-04 22:49:37 +08:00
namespace HK.Keyboard
{
public class Keyboard : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler
2025-06-04 22:49:37 +08:00
{
public TMP_InputField inputField;
public GameObject AlphaBoardUnshifted;
public GameObject AlphaBoardShifted;
public GameObject NumBoardUnshifted;
public GameObject NumBoardShifted;
public Button btnClickClose;
2025-06-04 22:49:37 +08:00
public Keyboard_Chin chin;
private List<KeyBind> keyBinds;
private List<KeyBind> keyBinds_Switch;
private Action OKAction;
public bool isHideOnAwake = false;
2025-06-04 22:49:37 +08:00
private bool isChin
{
get => chin.isChin;
set => chin.isChin = value;
}
private void Awake()
{
keyBinds = new List<KeyBind>();
keyBinds_Switch = new List<KeyBind>();
var list = transform.FindChildDeeps<KeyBind>();
foreach (var keyBind in list)
{
keyBinds.Add(keyBind);
keyBind.onClickAction += ClickKey;
if (keyBind.keyName == "Switch")
keyBinds_Switch.Add(keyBind);
}
isChin = false;
chin.selectedAction += ClickKey;
btnClickClose.onClick.AddListener(ClickClose);
2025-06-04 22:49:37 +08:00
ShowOnlyOne(AlphaBoardUnshifted);
if (isHideOnAwake)
{
gameObject.SetActive(false);
}
EventManager.Instance.Subscribe(OpenKeyboardEventArgs.EventId, OpenKeyboardEvent);
}
private void ClickClose()
{
gameObject.SetActive(false);
}
private void OnDestroy()
{
btnClickClose.onClick.RemoveListener(ClickClose);
EventManager.Instance.Unsubscribe(OpenKeyboardEventArgs.EventId, OpenKeyboardEvent);
}
private void OpenKeyboardEvent(object sender, GameEventArgs e)
{
var args = e as OpenKeyboardEventArgs;
inputField = args.inputField;
OKAction = args.OKAction;
gameObject.SetActive(true);
2025-06-04 22:49:37 +08:00
}
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 OnDisable()
2025-06-04 22:49:37 +08:00
{
tmp_Chin = "";
isChin = false;
isEnter = false;
OKAction = null;
inputField = null;
2025-06-04 22:49:37 +08:00
foreach (var keyBind in keyBinds_Switch)
keyBind.GetComponentInChildren<TMP_Text>().text = "英/<size=25>中</size>";
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":
2025-07-13 15:53:13 +08:00
gameObject.SetActive(false);
2025-06-04 22:49:37 +08:00
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;
2025-07-02 10:24:01 +08:00
case "OK":
OKAction?.Invoke();
gameObject.SetActive(false);
2025-07-02 10:24:01 +08:00
return false;
break;
2025-06-04 22:49:37 +08:00
case "Switch":
isChin = !isChin;
if (isChin)
foreach (var keyBind in keyBinds_Switch)
keyBind.GetComponentInChildren<TMP_Text>().text = "中/<size=25>英</size>";
else
foreach (var keyBind in keyBinds_Switch)
keyBind.GetComponentInChildren<TMP_Text>().text = "英/<size=25>中</size>";
return false;
break;
}
return true;
}
public void SetFont(TMP_FontAsset font)
{
inputField.fontAsset = font;
}
private bool isEnter;
public void OnPointerEnter(PointerEventData eventData)
{
isEnter = true;
}
public void OnPointerExit(PointerEventData eventData)
{
isEnter = false;
}
2025-06-04 22:49:37 +08:00
}
}