【问题标题】:Unity3D Convert Key Event to plain textUnity3D 将按键事件转换为纯文本
【发布时间】:2015-10-21 10:00:43
【问题描述】:

我正在为我的游戏实现一个虚拟控制台,我正在通过一个事件管道(可观察主题)来传递 Key up 事件,并使用

在虚拟控制台端处理它们
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 字母,但当您访问数字和其他字符时,我将获得原始键名,例如“Q”键上方的水平“1”键的“Alpha1”,“ Alpha2" 表示 "W" 上方的 "2" 等

有没有一种方法可以轻松地从键事件中获取“渲染”文本,而无需构建所有可能的键码结果的切换?

PS:我忘了说,shift+Alpha1 是“!”在美国 Querty 中 shift+Alpha2 为“@”等,但在不同国家的键盘上会有所不同,对世界上每个键盘都做 switch 语句是不可行的。

【问题讨论】:

  • 我不认为有办法在 Unity 中做你想做的事——它只是不知道本地化的键盘映射。他们在自己的 UI 代码中实现了一个类似的 switch 语句 - 您可以看到他们如何从第 844 行开始将文本添加到输入字段bitbucket.org/Unity-Technologies/ui/src/…
  • 在第 972 行,他们实际上是从中获取角色。但是,由于某种原因,我的总是空的。

标签: unity3d unity3d-gui unity3d-5


【解决方案1】:

这不是正确答案!!!

出于帮助进一步研究或让某人摆脱困境的精神,将其留在这里。

对于仅限美国 Querty 的键盘,这暂时有效,直到有人回复正确答案:

public static char ToChar (this Event e)
{
    var key = e.keyCode;
    char c = '\0';
    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;
}

【讨论】:

  • Alpha0 应该映射到 ')'。 { ')', '!', '@', '#', '$', '%', '^', '&', '*', '(' }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 2014-09-08
  • 2020-08-27
  • 2010-11-06
  • 1970-01-01
相关资源
最近更新 更多