Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 接收任何键盘输入并与Unity上的Switch语句一起使用_C#_Unity3d - Fatal编程技术网

C# 接收任何键盘输入并与Unity上的Switch语句一起使用

C# 接收任何键盘输入并与Unity上的Switch语句一起使用,c#,unity3d,C#,Unity3d,我不想使用if语句。为了简单和性能,我希望使用switch case并执行该方法。我想检测所有键盘输入。但是有什么方法可以传递按键信息吗? 我目前的做法是: // Update is called once per frame void Update() { char a = Input.GetKey();//anything like this method? switch (a) { case 'a': //print'

我不想使用if语句。为了简单和性能,我希望使用switch case并执行该方法。我想检测所有键盘输入。但是有什么方法可以传递按键信息吗? 我目前的做法是:

// Update is called once per frame
void Update()
{
    char a = Input.GetKey();//anything like this method?
    switch (a)
    {
        case 'a':
                //print'';
                break;
        case 'b':
                //print'';
                break;
        default:
            break;
    }

}
如何在没有if语句的情况下实现任何按键信息检测?

最佳解决方案-使用Input.inputString 您可以使用捕捉最后一帧中输入的键盘输入作为字符串

void Update()
{
//获取输入
var input=input.inputString;
//忽略空输入以避免不必要的计算
如果(!string.IsNullOrEmpty(输入))
//与按下的字符相关的逻辑
Log(“按下的字符:+Input.inputString”);
}

其他解决方案 Foreach循环

您可以使用foreach循环方法,就像在其他答案中建议的那样,但它并没有那么有效。Foreach分配了更多的内存,并且必须检查所有可能的键(它的可读性也较差)

如果您不关心时间和内存性能,那么您可能会遵循。它使用foreach循环方法并创建一个可重用的接口


OnGUI

最后,您可以捕获(这是一个unityGUI),如中所述,但这样做将依赖于该方法。这种方法的性能最差

foreach(KeyCode kcode in Enum.GetValues(typeof(KeyCode)))
{
    if (Input.GetKey(kcode))
    Debug.Log("KeyCode down: " + kcode);
}

您还可以缓存Enum.GetValues(typeof(KeyCode))的值进行优化。

我没有使用Unity,但是,我理解您的问题,我是一名C#开发人员

通过快速搜索,我在Unity论坛上找到了与您有类似问题的人。这是线

上面的代码(来自Unity论坛链接)允许您检测(键盘和鼠标)。然后,您可以通过检查输入是否仅是带有

这是您的文档。这还包括它可用的所有属性(许多与键盘相关的属性,您可以根据这些属性进行检查)

例如(未测试):

编辑:如其他答案所述,您可以尝试。根据文档,该文件仅包含“ASCII字符”。例如,如果您只想查看字母,那么可以在“更新”方法中执行类似操作

void Update()
{
    //get the input
    var input = Input.inputString;

    //ignore null input to avoid unnecessary computation
    if (!string.IsNullOrEmpty(input))
    {
        switch(input)
        {
            case 'a': break;
            case 'b': break;
        }
    }
}

希望这能有所帮助

您当前的方法是否无效?否。
Input.GetKey()无效。好的,对不起,我现在知道问题了。在一帧中按下或释放多个键的情况下,只打开一个键字母无法处理。现在还不清楚你到底想从答案中得到什么,因为你对答案的评论表明你不想使用循环。
Input.inputString
是一个有效的解决方案。给定的thisEvent.keyCode示例不起作用,需要引用。你能告诉我如何用-char c=Event.keyCode捕捉charecter吗;方式而不是使用foreach循环?谢谢。如果你想严格使用char,我会选择Input.inputString。我从来没有把密码转换成字符。您可以找到一个帮助器,但它只是一个将字符与键码关联的字典。我想将其标记为已接受,因为它是第一个提出解决方案的,但您的
事件。键码
示例不正确,给出了“NullReferenceException:对象引用未设置为对象实例”错误,第一次评论后没有修改。对不起,我当时误解了评论。您在场景中设置了EventSystem吗?是的,有一个事件系统,我的场景有多个按钮。非常感谢这个工作解决方案,但是它在每个帧上触发时会在单个按键上注册多个事件,因此必须使用keydown和keyup功能进行过滤。@Rifat您可能只关心一些按键,例如WASD,所以我们可以把它们放在一个列表中,只需检查这些特定的键,这将不会消耗太多的CPU时间和GC。Event.current在Update方法中不起作用,但只在OnGUI方法中起作用,所以我认为它不适用于这个用例。我的错我不知道。更新方法中的更新逻辑可能会有所帮助。
Event e = Event.current;
if (e.isKey)
{
    Debug.Log("Current Key is : " + e.keyCode.ToString());

    if(e.keyCode == KeyCode.A) //checks if the keycode returned equals the 'A' key
    {
         // Do something
    }
}
void Update()
{
    //get the input
    var input = Input.inputString;

    //ignore null input to avoid unnecessary computation
    if (!string.IsNullOrEmpty(input))
    {
        switch(input)
        {
            case 'a': break;
            case 'b': break;
        }
    }
}