Вы должны запустить метод для каждого ключа, чтобы вам не приходилось повторять один и тот же код снова и снова.
Идея состоит в том, чтобы сохранить данный ключ в списке. Использование словаря позволит исправить выбор
private List<KeyCode> keys = new List<KeyCode>();
private IDictionary<KeyCode, Note> dict;
struct Note
{
public string keyName;
public AudioClip clip;
public Note(string keyName, AudioClip clip)
{
this.keyName = keyName;
this.clip = clip;
}
}
void Start()
{
this.dict = new Dictionary<KeyCode, Note>()
{
{ KeyCode.A, new Note("A", noteA) },
{ KeyCode.B, new Note("B", noteB) },
// Same for all notes
};
}
void Update()
{
foreach(KeyCode kcode in Enum.GetValues(typeof(KeyCode)))
{
if (Input.GetKeyDown(kcode))
{
if( PlayKey(kCode) == true){ this.keys.Add(KeyCode); }
}
}
}
bool PlayKey(KeyCode key)
{
Note note;
if(this.dict.TryGetValue(key, out note) == true)
{
anim.SetTrigger(note.keyName);
audio.PlayOneShot(note.clip);
return true;
}
return false;
Debug.Log("Note is not registered");
}
void PlayAllKeys()
{
StartCoroutine(PlayAllKeysAsync);
}
IEnumerator PlayAllKeysAsync()
{
foreach(KeyCode key in this.keys)
{
PlayNote(key);
yield return new WaitForSeconds(1f); // Play note every 1s
}
}
Теперь у вас есть структура для Note, вы можете добавить к ней больше позже, например, когда она нажата в песне и как она удерживается нажатой (это потребует дополнительных вычислений для Input и deltaTime).
В словаре хранятся все известные заметки. В обновлении проверьте все KeyCode, вы можете создать список KeyCode, чтобы сузить это. Затем он проверяет в PlayNote, является ли данный ключ допустимым, а затем воспроизводит и сохраняет его.
сопрограмма воспроизводит их всех по одному с задержкой в одну секунду.