Probleme cu player muzical în Unitate

voturi
1

Așa că am fost de lucru pe un player de muzică în unitate. Ea devine audioclips dintr-o matrice din cadrul Unității, și un generator de numere aleatorii alege un clip între 0 și dimensiunea stabilită în unitate. Cu toate acestea, nimic nu se oprește la cules același număr (și, prin urmare, același cântec) de două ori într-un rând care este ceva ce nu vreau. Am încercat câteva lucruri, dar a ajuns cu un NullReferenceException. Dacă doriți să aruncăm o privire aș aprecia foarte mult!

Cod:

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
}

Întrebat 09/10/2019 la 12:53
sursa de către utilizator
În alte limbi...                            


2 răspunsuri

voturi
5

După cum deja mentioed în alt răspuns parametrul AudioSource.Play(ulong)este

întârziere
Deprecated.

Întârzierea în numărul de probe, presupunând o rată de eșantionare 44100Hz (ceea ce înseamnă că Redare (44100) va întârzia redarea de exact 1 sec).

Deci, ceea ce vrei să faci este

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

Atunci aș sugera mai degrabă folosind LINQWhere și se filtrează nedorită (= redat în acel moment) clip în prealabil , fără nici o while-loop ca

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();
    }
}
Publicat 09/10/2019 la 15:29
sursa de către utilizator

voturi
1

Se pare că nu setați clipul pentru audioSource folosind audioSource.clipproprietatea. Poate că ar fi mai ușor de a schimba string currentTitlevariabila pentru a fi o AudioClip currentClipși apoi să utilizați doar currentClip.titleproprietatea atunci când faci comparații egalitate. Apoi , la sfârșitul chiar înainte de a apela audioSource.Play()metoda pe care o puteți seta clipul după cum urmează: audioSource.clip = nextTitle;.

Un alt lucru de remarcat este faptul că parametrul la audioSource.Playmetoda este întârzierea , mai degrabă decât indicele clipului pentru a juca astfel încât trebuie să setați clipul primul și , probabil , nici măcar nu trebuie să treacă un parametru la audioSource.Playmetoda.

Publicat 09/10/2019 la 13:12
sursa de către utilizator

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