C# 钢琴键似乎是随机粘贴的-可以';我不明白为什么

C# 钢琴键似乎是随机粘贴的-可以';我不明白为什么,c#,unity3d,C#,Unity3d,我目前正在开发一个由Unity中的midi乐器输入控制的可视键盘。我对按键的反馈方法是将按键颜色的alpha更改为0.5,以显示当前正在按键。正常情况下,按键停止按下后,按键的颜色会重置为原来的颜色,但按键似乎会随机“粘住”,直到再次按下为止保持透明。以下是课堂上负责这项工作的部分: public class NewBehaviourScript : MonoBehaviour { Color tmp1, tmp2; SpriteRenderer[] keys = new S

我目前正在开发一个由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;
            }
        }
    }
}
公共类NewBehaviourScript:MonoBehavior{
颜色tmp1,tmp2;
spritterender[]键=新spritterender[32];
无效开始(){
对于(int i=48;i<80;i++){
keys[i-48]=GameObject.Find(i.ToString()).GetComponent();
}
}
无效更新(){
对于(int j=0;j<32;j++){
if(MidiMaster.GetKeyDown(j+48)){
tmp1=键[j]。颜色;
tmp1.a=0.5f;
键[j].颜色=tmp1;
}
if(MidiMaster.GetKeyUp(j+48)){
tmp2=键[j]。颜色;
tmp2.a=1f;
键[j].颜色=tmp2;
}
}
}
}
需要注意的是,在
GetKeyUp()
GetKeyDown()
调用中,
j
增加48的原因是键盘上第一个键的MIDI值是48,而不是0


此代码的哪一部分导致了随机卡滞?

问题可能出在MidiMaster.GetKeyUp/Down中

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

中的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;
}
for(int j=0;j<32;j++){
tmp1=键[j]。颜色;
//该值的范围为0.0(注释关闭)到1.0(最大速度)
tmp1.a=MidiMaster.GetKey(j+48)>0f?0.5f:1f;
键[j].颜色=tmp1;
}

如果将循环大小减小为。。。jyes,降低j不会改变问题