【问题标题】:How to use GetKeyDown() to efficiently detect when any key is being released如何使用 GetKeyDown() 有效地检测何时释放任何键
【发布时间】:2019-02-09 23:05:50
【问题描述】:

我首先要说我对 C# 和 Unity 很陌生,所以如果我缺乏被认为是常识的知识,请提前道歉。另外,我在这里检查了其他问题,但没有找到任何特别解决我的具体问题的答案。但是,如果有一个,我将不胜感激。

无论如何,我正在尝试编写一些代码,当按住某个键时会播放声音,而当松开键时会停止播放。不同的键会发出不同的声音,因此 GetKeyUp() 函数应该适用于当前按下的任何键。

我已经为 inputKey 声明了一个字符串,并且 inputKey 被分配了任何被按下的键,然后传递给包含 GetKeyUp() 函数的 if 语句。我已经尝试过这种方法的许多小变种,但我目前使用的是唯一没有产生错误消息的方法(尽管代码仍然不起作用)

public string inputKey;

else if (Input.GetKeyDown(KeyCode.S))
    {
        freq = 293.66;
        gain = volume;
    }

inputKey = (Input.inputString).ToUpper();

if (Input.GetKeyUp(KeyCode.inputKey));
    {
        gain = 0;
    }

所以在上面的例子中,当按下 S 键时,就会播放声音。 inputKey 显示为 'S' 所以我希望 'Input.GetKeyUp(KeyCode.inputKey)' 等同于 'Input.GetKeyUp(KeyCode.S' 和停止播放的声音,但事实并非如此声音继续播放。

任何帮助或建议将不胜感激,谢谢。

【问题讨论】:

    标签: c# unity3d keycode


    【解决方案1】:

    我会改用Input.GetKey()

    而不是检查“S 关闭了吗?开始播放 S 音。A 关闭了吗?开始播放 A 音。是否释放了任何键?它是什么键?停止播放那个声音”我会简单地检查每个键的当前状态并根据该状态开始或停止声音。

    例如

    soundOnS.gain = Input.GetKey(KeyCode.S) ? volume : 0;
    

    您当前的方法不能,也永远不能充分处理如果有人同时按下多个键会发生什么:当他们抬起一根手指,松开一个键(但不是另一个!)应该是什么声音玩吗?

    【讨论】:

    • 嗨,你的建议听起来不错,虽然我还不能让它为我工作。你能解释一下你建议的代码的每个部分在做什么吗?
    • 我一直在尝试类似 else if (Input.GetKey(KeyCode.J) ? gain : 0) { freq = 493.88;增益 = 音量;但我不断收到有关无法将浮点数显式转换为布尔值的错误消息。谢谢
    • 我做了更多的实验。在 'void update()' 函数中,我包含了 'gain = 0;'然后使用:'else if (Input.GetKey(KeyCode.J)) { freq = 493.88;增益 = 音量; ' 这可以按我的意愿工作,但是现在播放音符时,会随机听到咔嗒声。我认为这是因为'增益 = 0;'正在重读,因此笔记的音量正在反弹。它是否正确?如果是这样,我将如何解决这个问题?谢谢
    • @tewi 我不知道您的freqgain 变量稍后在程序中是如何使用的。无论哪种情况,您遇到的问题都可能是由于您的怀疑,这就是为什么我建议使用 ternary operator 而不是将增益设置为 0,然后根据 if 块将其重置为另一个值。
    • 嗨,你是对的 - 我应该更清楚我的变量及其用途。频率(频率)只是音频波的赫兹数,本质上只是控制声音的音高。增益是每种声音的一种单独的音量控制,音量变量本身在每个声音中保持不变。我现在制作了一个函数,它使用 if 语句来设置波的频率,并分别使用建议的三元运算来控制增益变量,从而获得所需的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    • 2018-01-16
    • 2018-01-17
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多