Problèmes avec lecteur de musique dans l'unité

voix
1

Donc, je travaille sur un lecteur de musique dans l'unité. Il obtient les clips audio à partir d'une matrice à l'intérieur de l'unité, et un générateur de nombres aléatoires sélectionne un clip entre 0 et la taille de l'ensemble dans l'unité. Cependant, rien ne l'empêche de choisir le même nombre (et donc même chanson) deux fois de suite ce qui est quelque chose que je ne veux pas. J'ai essayé quelques petites choses mais a fini avec un NullReferenceException. Si vous souhaitez jeter un oeil je l'apprécie beaucoup!

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
}

Créé 09/10/2019 à 12:53
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
5

Comme il a déjà mentioed dans l' autre réponse au paramètre AudioSource.Play(ulong)est

délai
Obsolète.

Retard dans nombre d'échantillons, en supposant un taux d'échantillonnage de 44100 (ce qui signifie que le jeu (44100) retardera le jeu exactement 1 sec).

Donc ce que vous voulez faire est

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

Ensuite , je préférerais vous suggérons d' utiliser LINQWhere et filtrer les indésirables (= en cours de lecture) découpez avance sans while-loop comme

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();
    }
}
Créé 09/10/2019 à 15:29
source utilisateur

voix
1

Il semble que vous ne définissez pas le clip pour le Audiosource en utilisant la audioSource.clippropriété. Peut-être qu'il serait plus facile de changer la string currentTitlevariable à un AudioClip currentClippuis il suffit d' utiliser la currentClip.titlepropriété en faisant les comparaisons d'égalité. Puis à la fin juste avant d'appeler la audioSource.Play()méthode que vous pouvez définir le clip comme suit: audioSource.clip = nextTitle;.

Une autre chose à noter est que le paramètre à la audioSource.Playméthode est le retard plutôt que de l'indice du clip à jouer afin que vous devez régler le clip premier et probablement ne même pas besoin de passer un paramètre à la audioSource.Playméthode.

Créé 09/10/2019 à 13:12
source utilisateur

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