我目前正在使用由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;
}
}
}
}
就像注释一样,j
和GetKeyUp()
调用中GetKeyDown()
增加48的原因是我键盘上第一个键的MIDI值是48,而不是0
此代码的哪一部分导致随机粘贴?
答案 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;
}