Problemer med musikkspiller i Unity

stemmer
1

Så jeg har jobbet med en musikkspiller i Unity. Det blir de audioclips fra en matrise innen enhet, og en slumptallgenerator plukker et klips mellom 0 og størrelsen angitt i Enhet. Men ingenting stopper den fra å plukke det samme antallet (og dermed samme sang) to ganger på rad som er noe jeg ikke vil ha. Jeg har prøvd et par ting, men endte opp med en NullReferenceException. Hvis du ønsker å ta en titt jeg stor pris på det!

Kode:

using System.Collections;
using UnityEngine;

public class MusicPlayer : MonoBehaviour
{
    #region Variables

    //Variables needed for this code
    public AudioClip[] clips;

    private AudioSource audioSource;

    string currentTitle = ;

    #endregion

    #region Start Void
    // Start is called before the first frame update
    void Start()
    {
        //Finds AudioSource in the unity editor and turns off the loop function.
        audioSource = FindObjectOfType<AudioSource>();
        audioSource.loop = false;
    }
    #endregion

    #region Private AudioClip
    //The code below will grab a random audio clip between 0 and the amount set in the Unity Editor.
    private AudioClip GetRandomClip()
    {
        return clips[Random.Range(0, clips.Length)];

    }
    #endregion

    #region Update Void
    // Update is called once per frame
    void Update()
    {


        if (audioSource.clip.name.Length >= 0)
        {
            currentTitle = audioSource.clip.name;
        }

        if (!audioSource.isPlaying)
        {
            var nextTitle = currentTitle;
            ulong index = 0;
            while (nextTitle == currentTitle)
            {
                index = (ulong) Random.Range(0, clips.Length);
                nextTitle = clips[index].name;
            }
            audioSource.Play(index);
        }


    }
    #endregion
}

Publisert på 09/10/2019 klokken 12:53
kilden bruker
På andre språk...                            


2 svar

stemmer
5

Som allerede mentioed i andre svare parameteren AudioSource.Play(ulong)er

forsinkelse
avviklet.

Forsinkelse i antall prøver, forutsatt en 44100Hz samplingsfrekvens (som betyr at Play (44100) vil forsinke spille med nøyaktig ett sekund).

Så hva du ønsker å gjøre er

audioSource.clip = newClip;
audioSource.Play();

Da ville jeg heller foreslå å bruke LinqWhere og filtrere uønsket (= tiden spiller) klippet ut på forhånd uten while-loop som

using System.Linq;

...

private AudioClip GetRandomClip()
{
    // This returns only those clips that are not the currenty played one
    var filteredClips = clips.Where(c => c != audioSource.clip).ToArray();

    return filteredClips[Random.Range(0, filteredClips.Length)];
}

void Update()
{
    if (!audioSource.isPlaying)
    {
        var newTitle = GetRandomClip();
        audioSource.clip = newTitle;
        audioSource.Play();
    }
}
Svarte 09/10/2019 kl. 15:29
kilden bruker

stemmer
1

Det ser ut som du ikke setter klippet for audioSource hjelp av audioSource.clipeiendommen. Kanskje det ville være lettere å endre string currentTitlevariabelen for å være en AudioClip currentClipog så bare bruke den currentClip.titleegenskapen når du gjør likestilling sammenligninger. Så på slutten like før du kaller audioSource.Play()metoden kan du sette klippet som følger: audioSource.clip = nextTitle;.

En annen ting å merke seg er at parameter til audioSource.Playmetoden er forsinkelsen snarere enn indeksen av klippet for å spille, så du trenger for å sette klippet første og sannsynligvis ikke engang trenger å passere en parameter til audioSource.Playmetoden.

Svarte 09/10/2019 kl. 13:12
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more