Как сыграть аудиоклипы в единстве из сценария?

Поэтому я пытаюсь заставить метод sing сыграть один из созданных мной аудиоклипов. Я знаю, что мне нужен аудио-источник, я просто понятия не имею, как он вписывается в аудио-клипы. В настоящее время у меня нет аудиозаписи, назначенной объекту, которому назначен этот сценарий, так что это может повлиять на ситуацию. Спасибо за вашу помощь.

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

public class Piano : MonoBehaviour {
private List<AudioClip> notes = new List<AudioClip>();

public string voice; 

public AudioClip ash1, a1, b1, csh1, c1, dsh1, d1, e1, f1, fsh1, g1, gsh1;

// Use this for initialization
void Start () {
    //octave1
    notes.Add(a1); notes.Add(b1); notes.Add(ash1); notes.Add(c1); notes.Add(csh1);notes.Add(d1); notes.Add(dsh1);
    notes.Add(e1); notes.Add(f1); notes.Add(g1); notes.Add(gsh1);

    WarmUp(voice);
}
//consider adding countertenor, true alto (i am using mezzo soprano), and baritone.
void WarmUp(string vp)
{
    //high and low end of voice parts 
    // 30 = c4 for example
    int high;
    int low;

    ArrayList range = new ArrayList();
    //c4 to c6 
    if (vp == "Soprano")
    {
        high = 0; //this is just a range to make the code shorter
        low = 7;

        for(int i = low; i < high; i++)
        {
            range.Add(notes[i]);
        }

        Sing(range);
    }
}

/**
 * @Param: range. the arraylist of range of notes. 
 * shift the pitch UP one half step if the up arrow key is pressed
 * shift the pitch down one half step if the down arrow key is pressed
 * shift the pitch up a third (4 half steps) if the left arrow key is pressed
 * shift the pitch up a fifth (7 half steps) if the right arrow key is pressed
 */
void Sing(ArrayList range)
{
    //how to play one of the audioclips in range here
}

// Update is called once per frame
void Update () {

}
}

3 ответа

Решение

Прикрепить AudioSource компонент для вашего GameObject.

В Sing:

yourAudioSource.clip = (AudioClip)range[Random.Range(0, range.Count)];
yourAudioSource.Play()

Вы также можете рассмотреть возможность изменения ArrayList range в List<AudioClip> range или подобный, чтобы избежать броска

Если вы приложите AudioSource компонент к GameObjectтогда вы могли бы установить AudioSource переменная для этого компонента, а затем вызвать функцию установки clip(AudioClip x) чтобы установить клип, источник должен воспроизводиться. В этот момент вы можете просто позвонить Play() и дождитесь длины аудиоклипа.

Код не должен быть слишком сложным для понимания, но если у вас есть еще вопросы, не стесняйтесь спрашивать. Удачи!

Возьмите переменную AudioSource _aSource и AudioClip _aClip и назначьте игровой объект аудиоисточника _aSource и обрежьте _aClip в инспекторе, а там, где хотите воспроизвести звук, просто напишите _aSource.PlayOneShot(a_Clip).

Другие вопросы по тегам