如何在 Unity 3D 中播放多个声音

How To Play Multiple Sounds in Unity 3D

我正在使用 Vuforia 和 Unity 4.6 开发增强现实钢琴。该应用程序将是一款游戏,其中手机 phone 会说出一个音符,例如:"C",用户将有 5 秒的时间在带有虚拟按钮的纸钢琴上弹奏该音符。

我遇到的问题是按下按钮时听不到钢琴键的声音。我确实在 switch 语句中输入了所需的情况,但是没有声音是 played.Neither Update 函数或 OnButtonPressed() 上的 play() 方法正在播放。但是在方法 generarNota() 上。我总是听 phone 说音符的声音。

这是我的代码:

public class ButtonControl : MonoBehaviour,IVirtualButtonEventHandler {
    public AudioSource c;
    public AudioSource cSharp;
    public AudioSource d;
    public AudioSource dSharp;
    public AudioSource e;
    public AudioSource f;
    public AudioSource fSharp;
    public AudioSource g;
    public AudioSource gSharp;
    public AudioSource a;
    public AudioSource aSharp;
    public AudioSource b;
    public AudioSource correctSound;
    public AudioSource incorrectSound;
    public AudioClip cv;
    public AudioClip cSharpv;
    public AudioClip dv;
    public AudioClip dSharpv;
    public AudioClip ev;
    public AudioClip fv;
    public AudioClip fSharpv;
    public AudioClip gv;
    public AudioClip gSharpv;
    public AudioClip av;
    public AudioClip aSharpv;
    public AudioClip bv;
    public AudioSource c2;
    public bool gameOn;
    string currentNote; //Nota genereada por el sistema
    string inputNote; //Nota presionada por el usuario
    public float waitTime; //Tiempo de espera entre notas
    public float resetWait; // Para reiniciar el tiempo de espera
    public int totalNotes;
    public int correctNotes;
    public int incorrectNotes;
    bool firstNote;
    bool beingHandled;
    public bool blackNotes;
    bool notePressed;
    //Use this for initialization
    void Start () {
        c.PlayOneShot(c.clip);
        blackNotes = false;
        this.notePressed = false;
        beingHandled = false;
        currentNote="NONE";
        waitTime = 0;
        firstNote = true;
        VirtualButtonBehaviour[] vbs = GetComponentsInChildren<VirtualButtonBehaviour>();
        for (int i = 0; i < vbs.Length; ++i) {
            // Register with the virtual buttons TrackableBehaviour
            vbs[i].RegisterEventHandler(this);
        }

    }
    void generarNota(){
        if (blackNotes) {
                        int num = Random.Range (1, 13);
                        //StartCoroutine ("waitTimeDelay");
                        switch (num) {
                        case 1:
                                Debug.Log ("Se genero C");
                                int a = 0;
                                currentNote = "C";
                                audio.clip = this.cv;
                                audio.PlayDelayed (0.5f);
    //this.aSource.PlayOneShot(this.cv);
                                break;
                        case 2:
                                Debug.Log ("Se genero C#");
                                currentNote = "C#";
                                audio.clip = this.cSharpv;
                                audio.PlayDelayed (0.5f);
                                break;
                        case 3:
                                Debug.Log ("Se genero D");
                                currentNote = "D";
                                audio.clip = this.dv;
                                audio.PlayDelayed (0.5f);
                                break;
                        case 4:
                                Debug.Log ("Se genero D#");
                                currentNote = "D#";
                                audio.clip = this.dSharpv;
                                audio.PlayDelayed (0.5f);
                                break;
                        case 5:
                                Debug.Log ("Se genero E");
                                currentNote = "E";
                                audio.clip = this.ev;
                                audio.PlayDelayed (0.5f);
                                break;
                        case 6:
                                Debug.Log ("Se genero F");
                                currentNote = "F";
                                audio.clip = this.fv;
                                audio.PlayDelayed (0.5f);
                                break;
                        case 7:
                                Debug.Log ("Se genero F#");
                                currentNote = "F#";
                                audio.clip = this.fSharpv;
                                audio.PlayDelayed (0.5f);
                                break;
                        case 8:
                                Debug.Log ("Se genero G");
                                currentNote = "G";
                                audio.clip = this.gv;
                                audio.PlayDelayed (0.5f);
                                break;
                        case 9:
                                Debug.Log ("Se genero G#");
                                currentNote = "G#";
                                audio.clip = this.gSharpv;
                                audio.PlayDelayed (0.5f);
                                break;
                        case 10:
                                Debug.Log ("Se genero A");
                                currentNote = "A";
                                audio.clip = this.av;
                                audio.PlayDelayed (0.5f);
                                break;
                        case 11:
                                Debug.Log ("Se genero A#");
                                currentNote = "A#";
                                audio.clip = this.aSharpv;
                                audio.PlayDelayed (0.5f);
                                break;
                        case 12:
                                Debug.Log ("Se genero B");
                                currentNote = "B";
                                audio.clip = this.bv;
                                audio.PlayDelayed (0.5f);
                                break;
                        }
                        this.totalNotes++;
                } 
        else {
            int num = Random.Range (1, 8);
            //StartCoroutine ("waitTimeDelay");
            switch (num) {
            case 1:
                Debug.Log ("Se genero C");
                int a = 0;
                currentNote = "C";
                audio.clip = this.cv;
                audio.PlayDelayed (0.5f);
                //this.aSource.PlayOneShot(this.cv);
                break;

            case 2:
                Debug.Log ("Se genero D");
                currentNote = "D";
                audio.clip = this.dv;
                audio.PlayDelayed (0.5f);
                break;

            case 3:
                Debug.Log ("Se genero E");
                currentNote = "E";
                audio.clip = this.ev;
                audio.PlayDelayed (0.5f);
                break;
            case 4:
                Debug.Log ("Se genero F");
                currentNote = "F";
                audio.clip = this.fv;
                audio.PlayDelayed (0.5f);
                break;

            case 5:
                Debug.Log ("Se genero G");
                currentNote = "G";
                audio.clip = this.gv;
                audio.PlayDelayed (0.5f);
                break;

            case 6:
                Debug.Log ("Se genero A");
                currentNote = "A";
                audio.clip = this.av;
                audio.PlayDelayed (0.5f);
                break;

            case 7:
                Debug.Log ("Se genero B");
                currentNote = "B";
                audio.clip = this.bv;
                audio.PlayDelayed (0.5f);
                break;
            }
            this.totalNotes++;



        }

    }
    void waitTimeDelay(){


    }
    // Update is called once per frame
    void Update () {
        if (this.gameOn) {
            if(this.waitTime>0){
                this.waitTime-= Time.deltaTime; 
                //Verificamos el boton. Si esta presionado el correcto sumamos a las notas correctas
                if(inputNote==this.currentNote){
                    //audio.clip = this.correctSound;
                    //audio.Play();
                    correctSound.Play();
                    this.correctNotes++;
                    inputNote ="NONE.";
                    this.waitTime = resetWait;
                    this.generarNota();

                }
                else if(inputNote!= "NONE." && inputNote != this.currentNote){
                    //Si la nota es incorrecta, agregamos uno a las incorrectas y generamos una nueva nota
                    //audio.clip = this.incorrectSound;
                    //audio.Play();
                    incorrectSound.Play();
                    this.incorrectNotes++;
                    inputNote ="NONE.";
                    this.generarNota();
                    this.waitTime = resetWait;
                }
                //Generamos nueva nota

                //Reiniciamos 

            }
            else{
                //Reiniciamos el tiempo 
                this.waitTime = this.resetWait;
                if(!this.firstNote){
                    // Como no presiono nada, nota erronea
                    this.incorrectNotes++;
                    incorrectSound.Play();
                    //audio.clip = this.incorrectSound;
                    //audio.Play();

                    //this.aSource.PlayOneShot(this.incorrectSound);



                }
                else{
                    this.firstNote = false;

                }
                //generamos una nueva nota
                this.generarNota();


            }


        }


    }

    public void OnButtonPressed(VirtualButtonAbstractBehaviour vb){
        if (blackNotes&&!notePressed) {

        switch (vb.VirtualButtonName) {
            case "buttonC":
                    this.inputNote = "C";
                    //audio.PlayOneShot (c);
                    break;
            case "buttonCSharp":
                    this.inputNote = "C#";
                    //audio.PlayOneShot (cSharp);
                    break;          
            case "buttonD":
                    this.inputNote = "D";
                    //audio.PlayOneShot (d);
                    break;

            case "buttonDSharp":
                    this.inputNote = "D#";
                    //audio.PlayOneShot (dSharp);
                    break;

            case "buttonE":
                    this.inputNote = "E";
                    //audio.PlayOneShot (e);
                    break;
            case "buttonF":
                    this.inputNote = "F";
                    //audio.PlayOneShot (f);
                    break;
            case "buttonFSharp":
                    this.inputNote = "F#";
                    //audio.PlayOneShot (fSharp);
                    break;
            case "buttonG":
                    this.inputNote = "G";
                    //audio.PlayOneShot (g);

                    break;
            case "buttonGSharp":
                    this.inputNote = "G#";
                    //audio.PlayOneShot (gSharp);
                    break;
            case "buttonA":
                    this.inputNote = "A";
                    //audio.PlayOneShot (a);
                    break;
            case "buttonASharp":
                    this.inputNote = "A#";
                    //audio.PlayOneShot (aSharp);
                    break;

            case "buttonB":
                    this.inputNote = "B";
                    //audio.PlayOneShot (b);
                    break;
            case "buttonC2":
                    this.inputNote = "C";
                    //audio.PlayOneShot (c2);
                    break;
            }
            notePressed=true;
                } 
        else if(blackNotes==false && notePressed==false){

            switch (vb.VirtualButtonName) {
            case "buttonC":
                this.inputNote = "C";
                Debug.Log ("Se Presiono C");
                c.Play();
                break;      
            case "buttonD":
                this.inputNote = "D";
                d.Play();
                Debug.Log ("Se Presiono D");
                break;

            case "buttonE":
                this.inputNote = "E";
                e.Play();
                Debug.Log ("Se Presiono E");
                break;
            case "buttonF":
                this.inputNote = "F";
                f.Play();
                Debug.Log ("Se Presiono F");
                break;
            case "buttonG":
                this.inputNote = "G";
                g.Play();
                Debug.Log ("Se Presiono G");
                break;
            case "buttonA":
                this.inputNote = "A";
                a.Play();
                Debug.Log ("Se Presiono A");
                break;

            case "buttonB":
                this.inputNote = "B";
                b.Play();
                           Debug.Log ("Se Presiono B");
                break;
            case "buttonC2":
                this.inputNote = "C";
                c2.Play();
                Debug.Log ("Se Presiono C2");
                break;
            }

            notePressed=true;
        }
    }
        //If para cada tecla del piano

        //audio.PlayOneShot(myClip);

        //Comparamos si las notas son iguales.
        //Si son iguales, sonido correcto+generar una nueva nota+sumar contador de puntos


        //Si no son iguales--> sonido de error+ terminar juego




    public void OnButtonReleased(VirtualButtonAbstractBehaviour vb){
        notePressed = false;
        this.inputNote = "NONE.";
        Debug.Log ("BUTTON UNPRESSED");



    }
}

这也是我的编辑器屏幕截图,因此您可以检查我是否为每个音频源附加了音频剪辑。

谁能帮我找出问题所在?

制作一个数组,而不是多个AudioSource。 2 关于代码结构的主要问题。

1 - 仅适用于可多次点击的移动设备。您没有使用 Touches

2 - 因为您没有使用数组。您总是必须用新的 Audio Source 移除当前播放的 Audio Source,而不是从 AudioSource Array 迭代。 audio.clip 将始终删除当前正在播放的那个。

AudioSource[] myNotes;
myNotes[0].PlayOnce();
myNotes[3].PlayOnce();

//Don't do this. 
// audio.clip = <---- NO!!!