Беда с единством игры - PullRequest
0 голосов
/ 06 мая 2018

Я делаю 2D игру для пианиста. Я в основном закончил, но я новичок в Unity и программировании на C #, и я не уверен, как сделать следующую часть. Что мне сделать, чтобы при нажатии кнопки записи записывать ноты, а затем воспроизводить их при нажатии кнопки воспроизведения? Мой сценарий ниже. Заранее благодарю за помощь

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NotePlay : MonoBehaviour {
    Animator anim;
    public AudioClip noteA;
    public AudioClip noteB;
    public AudioClip noteC;
    public AudioClip noteD;
    public AudioClip noteE;
    public AudioClip noteF;
    public AudioClip noteG;
    public AudioSource audio;
    public string[] store;
    private KeyCode lastHitKey;

    // Use this for initialization
    void Start() {
        anim = gameObject.GetComponent<Animator>();
        audio = GetComponent<AudioSource>();
    }

    // Update is called once per frame
    void Update() {
        if (Input.GetKeyDown(KeyCode.A)) {
            anim.SetTrigger("A");
            audio.PlayOneShot(noteA);
        }
        if (Input.GetKeyDown(KeyCode.B)) {
            anim.SetTrigger("B");
            audio.PlayOneShot(noteB); 
        }
        if (Input.GetKeyDown(KeyCode.C)) {
            audio.PlayOneShot(noteC);
            anim.SetTrigger("C");
        }
        else if (Input.GetKeyDown(KeyCode.D)) {
            anim.SetTrigger("D");
            audio.PlayOneShot(noteD);
        }
        else if (Input.GetKeyDown(KeyCode.E)) {
            anim.SetTrigger("E");
            audio.PlayOneShot(noteE);
        }
        if (Input.GetKeyDown(KeyCode.F)) {
            anim.SetTrigger("F");
            audio.PlayOneShot(noteF);
        }
        if (Input.GetKeyDown(KeyCode.G)) {
            anim.SetTrigger("G");
            audio.PlayOneShot(noteG);
        }
    }
}

1 Ответ

0 голосов
/ 07 мая 2018

Вы должны запустить метод для каждого ключа, чтобы вам не приходилось повторять один и тот же код снова и снова. Идея состоит в том, чтобы сохранить данный ключ в списке. Использование словаря позволит исправить выбор

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, является ли данный ключ допустимым, а затем воспроизводит и сохраняет его.

сопрограмма воспроизводит их всех по одному с задержкой в ​​одну секунду.

...