Единство игры на фортепиано проблемы с воспроизведением записанных нот - PullRequest
0 голосов
/ 11 мая 2018

У меня есть приложение для фортепиано в единстве, и я использую ArrayList, чтобы добавить ноты, а затем воспроизводить его, и он работает в основном, но метод воспроизведения, так как он активируется, когда playMode равен true, он продолжается в цикле, мне нужно знать,как я могу использовать оператор if, чтобы проверить, все ли записанные ноты были воспроизведены и, если они есть, цикл должен прерваться.Мне действительно нужна помощь.

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

public class NotePlay: MonoBehaviour
{


public Button record, play;

public bool recordMode = false;
public bool playMode = false;
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 int count = 0;
// Use this for initialization

public ArrayList notes;

void Start()
{
    anim = gameObject.GetComponent<Animator>();
    audio = GetComponent<AudioSource>();
    notes = new ArrayList();
    Button rec = record.GetComponent<Button>();
    Button pl = play.GetComponent<Button>();
    record.onClick.AddListener(()=>{ recordMode = !recordMode; });
    play.onClick.AddListener(() => { playMode = !playMode; recordMode = 
  false; });


}

void Playback()
{
    bool flag = true;
    for (int i = 0; i < notes.Count && flag; i++)
    {


        char c = (char)notes[i];

        System.Threading.Thread.Sleep(1000);
        PlayNote(c);
        print(c);

         // i want the recorded notes to only play once 
        if ()
        {



        }

    }


}

void PlayNote(char note)
{

    if (note == 'a')
    {

        //anim.SetTrigger("A");
        GameObject.Find("Sphere_A").GetComponent<AudioSource> 
    ().PlayOneShot(noteA);
        GameObject.Find("Sphere_A").GetComponent<Animator> 
    ().SetTrigger("A");
        print("a");
    }
    if (note == 'b')
    {

        //anim.SetTrigger("B");
        GameObject.Find("Sphere_B").GetComponent<AudioSource> 
   ().PlayOneShot(noteB);
        GameObject.Find("Sphere_B").GetComponent<Animator> 
   ().SetTrigger("B");
        print("b");

    }
    if (note == 'c')
    {

        ///anim.SetTrigger("C");
         GameObject.Find("Sphere_C").GetComponent<AudioSource> 
    ().PlayOneShot(noteC);
            GameObject.Find("Sphere_C").GetComponent<Animator> 
   ().SetTrigger("C");
    }
    if (note == 'd')
    {

        //anim.SetTrigger("D");
        GameObject.Find("Sphere_D").GetComponent<AudioSource> 
   ().PlayOneShot(noteD);
        GameObject.Find("Sphere_D").GetComponent<Animator> 
   ().SetTrigger("D");
    }
    if (note == 'e')
    {

        //anim.SetTrigger("E");
        GameObject.Find("Sphere_E").GetComponent<AudioSource> 
   ().PlayOneShot(noteE);
        GameObject.Find("Sphere_E").GetComponent<Animator> 
   ().SetTrigger("E");
    }
    else if (note == 'f')
    {

        // anim.SetTrigger("F");
        GameObject.Find("Sphere_F").GetComponent<AudioSource> 
   ().PlayOneShot(noteF);
         GameObject.Find("Sphere_F").GetComponent<Animator> 
   ().SetTrigger("F");
    }
    else if (note == 'g')
    {

        //anim.SetTrigger("G");
        GameObject.Find("Sphere_G").GetComponent<AudioSource> 
   ().PlayOneShot(noteG);
        GameObject.Find("Sphere_G").GetComponent<Animator> 
   ().SetTrigger("G");
    }
}
// Update is called once per frame
void Update()
{



    if (recordMode == true)
    {
        if (Input.GetKeyDown(KeyCode.A)) {notes.Add('a'); PlayNote('a'); }
        if (Input.GetKeyDown(KeyCode.B)) {notes.Add('b'); PlayNote('b'); }
        if (Input.GetKeyDown(KeyCode.C)) {notes.Add('c'); PlayNote('c'); }
        if (Input.GetKeyDown(KeyCode.D)) {notes.Add('d'); PlayNote('d'); }
        if (Input.GetKeyDown(KeyCode.E)) {notes.Add('e'); PlayNote('e'); }
        if (Input.GetKeyDown(KeyCode.F)) {notes.Add('f'); PlayNote('f'); }
        if (Input.GetKeyDown(KeyCode.G)) {notes.Add('g'); PlayNote('g'); }         
    }
    else
    {
        if (Input.GetKeyDown(KeyCode.A)) {  PlayNote('a'); }
        if (Input.GetKeyDown(KeyCode.B)) {  PlayNote('b'); }
        if (Input.GetKeyDown(KeyCode.C)) {  PlayNote('c'); }
        if (Input.GetKeyDown(KeyCode.D)) {  PlayNote('d'); }
        if (Input.GetKeyDown(KeyCode.E)) {  PlayNote('e'); }
        if (Input.GetKeyDown(KeyCode.F)) {  PlayNote('f'); }
        if (Input.GetKeyDown(KeyCode.G)) {  PlayNote('g'); }
    }
    if (playMode == true )
    {
        Playback();
    }

}

}

1 Ответ

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

Вы можете указать, что AudioSource не должен зацикливать звук.Добавьте эту строку в ваш метод Start:

void Start()
{
    anim = gameObject.GetComponent<Animator>();
    audio = GetComponent<AudioSource>();
    audio.loop = false;        // <--------------- HERE
    notes = new ArrayList();
    Button rec = record.GetComponent<Button>();
    Button pl = play.GetComponent<Button>();
    record.onClick.AddListener(()=>{ recordMode = !recordMode; });
    play.onClick.AddListener(() => { playMode = !playMode; recordMode = false; });    
}

Вы можете сделать это в коде, как указано выше, или непосредственно в инспекторе вашего AudioSource.Я думаю, что значение свойства loop по умолчанию установлено в true, поэтому оно зацикливается, когда вы играете ноту.

...