Problemen met muziekspeler in Unity

stemmen
1

Dus ik heb gewerkt aan een muziekspeler in Unity. Krijgt het audioclips uit een array binnen eenheid en een random getalgenerator kiest een clip tussen 0 en de in Unity grootte. Echter, niets stopt het van hetzelfde nummer (en dus hetzelfde nummer) plukken twee keer op rij dat is iets wat ik niet wil. Ik heb geprobeerd een paar dingen, maar eindigde met een NullReferenceException. Indien u graag een kijkje te nemen zou ik het zeer waarderen!

Code:

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
}

De vraag is gesteld op 09/10/2019 om 12:53
bron van user
In andere talen...                            


2 antwoorden

stemmen
5

Zoals reeds in het mentioed andere beantwoorden de parameter van AudioSource.Play(ulong)is

vertraging
verouderd.

Vertraging in aantal monsters, uitgaande van een 44100Hz samplefrequentie (wat betekent dat Play (44100) het spel zal vertragen met exact 1 seconde).

Dus wat je wilt doen is

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

Dan zou ik liever suggereren met behulp van LinqWhere en filteren van de ongewenste (= moment wordt afgespeeld) clip op voorhand, zonder enige while-loop als

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();
    }
}
antwoordde op 09/10/2019 om 15:29
bron van user

stemmen
1

Het lijkt erop dat je niet de clip voor de AudioSource ingesteld met de audioSource.clipeigenschap. Misschien zou het gemakkelijker zijn om het te veranderen string currentTitlevariabele om een te zijn AudioClip currentClipen dan gewoon het gebruik van currentClip.titleeigendom bij het doen van de vergelijkingen gelijkheid. Aan het einde net voordat u het gesprek audioSource.Play()methode kunt u de clip als volgt vastgesteld: audioSource.clip = nextTitle;.

Een ander ding om op te merken is dat de parameter aan de audioSource.Playmethode is de vertraging in plaats van de index van de clip te spelen, zodat je nodig hebt om de clip eerst en waarschijnlijk niet eens nodig om een parameter doorgeven aan de audioSource.Playmethode.

antwoordde op 09/10/2019 om 13:12
bron van user

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