Проблемы с музыкальным проигрывателем в Unity

голоса
1

Так что я работал над музыкальным проигрывателем в Unity. Он получает audioclips из массива в Unity, и генератор случайных чисел выбирает клип от 0 до размера, установленного в Unity. Тем не менее, ничто не останавливает его от выбора такое же количество (и, следовательно, та же песня) два раза подряд, который что-то я не хочу. Я пытался несколько вещей, но в конечном итоге с NullReferenceException. Если вы хотите, чтобы посмотреть что я очень ценю это!

Код:

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
}

Задан 09/10/2019 в 12:53
источник пользователем
На других языках...                            


2 ответов

голоса
5

Как уже mentioed в другой ответ параметр AudioSource.Play(ulong)является

Задержка
Осуждаемый.

Задержка в количестве образцов, предполагая частоту дискретизации 44100Hz (это означает, что воспроизведение (+44100) задержит играть ровно 1 сек).

Так что вы хотите сделать, это

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

Тогда я предпочел бы предложить использовать LinqWhere и фильтровать нежелательный (= воспроизводится в данный момент) выстригать заранее без каких - либо while-loop как

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();
    }
}
Ответил 09/10/2019 в 15:29
источник пользователем

голоса
1

Похоже , что вы не установите клип на AudioSource используя audioSource.clipсвойство. Возможно , было бы проще изменить string currentTitleпеременную , чтобы быть , AudioClip currentClipа затем просто использовать currentClip.titleсвойство при выполнении сравнений равенства. Тогда в конце концов просто перед вызовом audioSource.Play()метода вы можете установить клип следующим образом : audioSource.clip = nextTitle;.

Другое дело , следует отметить, что параметр для audioSource.Playметода является задержка , а не индекс клипа , чтобы играть так что вам нужно , чтобы установить клип первым и , возможно , даже не нужно передать параметр в audioSource.Playметоде.

Ответил 09/10/2019 в 13:12
источник пользователем

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