एकता में म्यूजिक प्लेयर के साथ समस्याएं

वोट
1

इसलिए मैं एकता में एक म्यूजिक प्लेयर पर काम कर रहा है। यह एकता के भीतर एक सरणी से audioclips हो जाता है, और एक यादृच्छिक संख्या जनरेटर 0 और आकार एकता में सेट के बीच एक क्लिप उठाता है। हालांकि, कुछ भी नहीं एक ही नंबर (और इस प्रकार एक ही गीत) एक पंक्ति जो कुछ मैं नहीं करना चाहता है में दो बार उठा से रोकता है। मैं कुछ चीजें कोशिश कर रहा है, लेकिन एक 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