2025-06-04 22:49:37 +08:00
|
|
|
|
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<KeyBind> keyBinds;
|
|
|
|
|
private List<KeyBind> keyBinds_Switch;
|
2025-07-02 10:24:01 +08:00
|
|
|
|
public Action OKAction;
|
2025-07-11 22:35:50 +08:00
|
|
|
|
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;
|
|
|
|
|
inputField.shouldHideSoftKeyboard = true;
|
|
|
|
|
chin.selectedAction += ClickKey;
|
|
|
|
|
|
|
|
|
|
inputField.onSelect.AddListener((a) => { gameObject.SetActive(true); });
|
|
|
|
|
ShowOnlyOne(AlphaBoardUnshifted);
|
2025-07-11 22:35:50 +08:00
|
|
|
|
if (isHideOnAwake)
|
|
|
|
|
{
|
|
|
|
|
gameObject.SetActive(false);
|
|
|
|
|
}
|
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 Reset()
|
|
|
|
|
{
|
|
|
|
|
tmp_Chin = "";
|
|
|
|
|
isChin = false;
|
|
|
|
|
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-08 22:07:35 +08:00
|
|
|
|
OKAction?.Invoke();
|
|
|
|
|
// 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();
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|