Unity3D 将按键事件转为纯文本
Unity3D Convert Key Event to plain text
我正在为我的游戏实现一个虚拟控制台,我正在通过事件管道(Observable Subject)传递 Key 事件,并在虚拟控制台端使用
处理它们
public void ReceiveInput (Event e)
{
Debug.Log ("ReceiveInput: " + e.ToString ());
if (e.keyCode == KeyCode.Backspace) {
if (ConsoleInputLine.LineText.Length > 2)
ConsoleInputLine.RemoveLastChar ();
return;
}
if (e.keyCode == KeyCode.Return || e.keyCode == KeyCode.KeypadEnter) {
ConsoleInputLine.LineText = "$ ";
return;
}
var chr = e.keyCode.ToString ();
if (e.capsLock || e.shift)
chr = chr.ToUpper ();
else
chr = chr.ToLower ();
ConsoleInputLine.AppendText ("" + chr);
}
虽然这适用于简单的 A-Z 和 a-z 字母,但当您输入数字和其他字符时,我会得到原始键名,例如 "Alpha1" 表示 [= 上方的水平“1”键20=]键,"Alpha2"上面的“2”"W",等等
有没有一种方法可以轻松地从按键事件中获取 "rendered" 文本,而无需构建所有可能的按键代码结果的开关?
PS: 忘了说了,shift+Alpha1 是 "!" US Querty中shift+Alpha2为“@”等,但在不同国家的键盘上会有所不同,世界上每个键盘都写switch语句是不可行的。
这不是正确答案!!!
本着协助进一步研究或帮助某人摆脱困境的精神将其留在这里。
仅适用于 US Querty 键盘,目前有效,直到有人回复正确答案:
public static char ToChar (this Event e)
{
var key = e.keyCode;
char c = '[=10=]';
if ((key >= KeyCode.A) && (key <= KeyCode.Z))
return (char)((int)((e.shift || e.capsLock) ? 'A' : 'a') + (int)(key - KeyCode.A));
if ((key >= KeyCode.Alpha0) && (key <= KeyCode.Alpha9)) {
if (e.shift) {
var specials = new char[] {'!', '@', '#', '$', '%', '^', '&', '*', '(', ')'};
return specials [(int)(key - KeyCode.Alpha0)];
}
return (char)((int)'0' + (int)(key - KeyCode.Alpha0));
}
if (key == KeyCode.Space)
return ' ';
if (key == KeyCode.Quote)
return (e.shift) ? '"' : '\'';
if (key == KeyCode.LeftBracket)
return (e.shift) ? '{' : '[';
if (key == KeyCode.RightBracket)
return (e.shift) ? '}' : ']';
if (key == KeyCode.BackQuote)
return (e.shift) ? '~' : '`';
if (key == KeyCode.Backslash)
return (e.shift) ? '|' : '\';
if (key == KeyCode.Equals)
return (e.shift) ? '+' : '=';
if (key == KeyCode.Minus)
return (e.shift) ? '_' : '-';
if (key == KeyCode.Semicolon)
return (e.shift) ? ':' : ';';
if (key == KeyCode.Comma)
return (e.shift) ? '<' : ',';
if (key == KeyCode.Period)
return (e.shift) ? '>' : '.';
if (key == KeyCode.Slash)
return (e.shift) ? '?' : '/';
// implement more
return c;
}
我正在为我的游戏实现一个虚拟控制台,我正在通过事件管道(Observable Subject)传递 Key 事件,并在虚拟控制台端使用
处理它们public void ReceiveInput (Event e)
{
Debug.Log ("ReceiveInput: " + e.ToString ());
if (e.keyCode == KeyCode.Backspace) {
if (ConsoleInputLine.LineText.Length > 2)
ConsoleInputLine.RemoveLastChar ();
return;
}
if (e.keyCode == KeyCode.Return || e.keyCode == KeyCode.KeypadEnter) {
ConsoleInputLine.LineText = "$ ";
return;
}
var chr = e.keyCode.ToString ();
if (e.capsLock || e.shift)
chr = chr.ToUpper ();
else
chr = chr.ToLower ();
ConsoleInputLine.AppendText ("" + chr);
}
虽然这适用于简单的 A-Z 和 a-z 字母,但当您输入数字和其他字符时,我会得到原始键名,例如 "Alpha1" 表示 [= 上方的水平“1”键20=]键,"Alpha2"上面的“2”"W",等等
有没有一种方法可以轻松地从按键事件中获取 "rendered" 文本,而无需构建所有可能的按键代码结果的开关?
PS: 忘了说了,shift+Alpha1 是 "!" US Querty中shift+Alpha2为“@”等,但在不同国家的键盘上会有所不同,世界上每个键盘都写switch语句是不可行的。
这不是正确答案!!!
本着协助进一步研究或帮助某人摆脱困境的精神将其留在这里。
仅适用于 US Querty 键盘,目前有效,直到有人回复正确答案:
public static char ToChar (this Event e)
{
var key = e.keyCode;
char c = '[=10=]';
if ((key >= KeyCode.A) && (key <= KeyCode.Z))
return (char)((int)((e.shift || e.capsLock) ? 'A' : 'a') + (int)(key - KeyCode.A));
if ((key >= KeyCode.Alpha0) && (key <= KeyCode.Alpha9)) {
if (e.shift) {
var specials = new char[] {'!', '@', '#', '$', '%', '^', '&', '*', '(', ')'};
return specials [(int)(key - KeyCode.Alpha0)];
}
return (char)((int)'0' + (int)(key - KeyCode.Alpha0));
}
if (key == KeyCode.Space)
return ' ';
if (key == KeyCode.Quote)
return (e.shift) ? '"' : '\'';
if (key == KeyCode.LeftBracket)
return (e.shift) ? '{' : '[';
if (key == KeyCode.RightBracket)
return (e.shift) ? '}' : ']';
if (key == KeyCode.BackQuote)
return (e.shift) ? '~' : '`';
if (key == KeyCode.Backslash)
return (e.shift) ? '|' : '\';
if (key == KeyCode.Equals)
return (e.shift) ? '+' : '=';
if (key == KeyCode.Minus)
return (e.shift) ? '_' : '-';
if (key == KeyCode.Semicolon)
return (e.shift) ? ':' : ';';
if (key == KeyCode.Comma)
return (e.shift) ? '<' : ',';
if (key == KeyCode.Period)
return (e.shift) ? '>' : '.';
if (key == KeyCode.Slash)
return (e.shift) ? '?' : '/';
// implement more
return c;
}