钢琴键似乎随机地粘着 - 无法弄清楚原因

时间:2018-01-05 23:36:48

标签: c# unity3d

我目前正在使用由Unity中的midi乐器输入控制的可视键盘。我对按键反馈的反馈方法是将键的颜色的alpha改为0.5,以显示当前正在按下它。通常,在按下按键后,按键的颜色会被重置为原来的颜色,但是看似随机的按键会粘在一起,保持透明,直到再次按下它为止。以下是负责此事务的班级的一部分:

public class NewBehaviourScript : MonoBehaviour {

    Color tmp1, tmp2;

    SpriteRenderer[] keys = new SpriteRenderer[32];

    void Start () {
        for (int i = 48; i < 80; i++) {
            keys [i - 48] = GameObject.Find (i.ToString()).GetComponent<SpriteRenderer> ();
        }
    }

    void Update () {

        for (int j = 0; j < 32; j++) {
            if (MidiMaster.GetKeyDown (j + 48)) {
                tmp1 = keys [j].color;
                tmp1.a = 0.5f;
                keys [j].color = tmp1;
            }

            if (MidiMaster.GetKeyUp (j + 48)) {
                tmp2 = keys [j].color;
                tmp2.a = 1f;
                keys [j].color = tmp2;
            }
        }
    }
}

就像注释一样,jGetKeyUp()调用中GetKeyDown()增加48的原因是我键盘上第一个键的MIDI值是48,而不是0

此代码的哪一部分导致随机粘贴?

1 个答案:

答案 0 :(得分:1)

问题可能在于MidiMaster.GetKeyUp / Down。

如果MidiMaster.GetKeyUp / Down的工作方式与Unity Input.GetKeyUp / Down相同,则方法仅在事件发生的帧期间返回true。

https://github.com/keijiro/MidiJack中的MidiMaster有一个类似于Input.GetKey的方法(告诉键是否按下了键)。也许你可以使用它:

for (int j = 0; j < 32; j++) {
    tmp1 = keys[j].color;
    // The value ranges from 0.0 (note-off) to 1.0 (maximum velocity)
    tmp1.a = MidiMaster.GetKey(j + 48) > 0f ? 0.5f : 1f;
    keys[j].color = tmp1;
}