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

170 lines
5.3 KiB
C#
Raw Normal View History

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;
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);
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;
}
}
}