Unity AudioSource.Play () не работает, когда компонент AudioSource добавлен из скрипта - PullRequest
0 голосов
/ 06 апреля 2020

Название в значительной степени подводит итог моей проблемы. Я использую сценарий AudioManager для воспроизведения одного из звуков из массива. Кажется, что все переменные были назначены правильно, и я могу получить доступ ко всем свойствам AudioSource. Однако, когда я звоню Play(), в редакторе нет звука. Я также проверил это, вручную добавив один AudioSource компонент и вызвав AudioSource.Play() из моего метода play (закомментированная строка в Play()), и он работает просто отлично. Ниже приведены два сценария, о которых идет речь. Я не получаю ошибок или предупреждений.

Я использую Unity 2019.3.3f

Обновление: Итак, я обнаружил проблему, переменная высоты тона класса Sound была неинициализирована, поэтому по умолчанию 0.

public class AudioManager : MonoBehaviour
{
    public Sound[] sounds;
    public static AudioManager instance;

    void Awake()
    {
        DontDestroyOnLoad(gameObject);

        if (instance == null) instance = this;
        else
        {
            Destroy(gameObject);
            return;
        }

        foreach (Sound s in sounds)
        {
            s.audioSource = gameObject.AddComponent<AudioSource>();
            s.audioSource.clip = s.clip;
            s.audioSource.volume = s.volume;
            s.audioSource.pitch = s.pitch;
            s.audioSource.playOnAwake = s.playOnAwake;
        }
    }

    public void Play(string name)
    {
        Sound s = Array.Find(sounds, sound => sound.name == name);
        s.audioSource.Play();
        // gameObject.GetComponent<AudioSource>().Play();
    }
}
[System.Serializable]
public class Sound
{
    public string name;
    public AudioClip clip;
    [Range(0f, 1f)] public float volume;
    [Range(-3f, 3f)] public float pitch;
    public bool playOnAwake = false;
    [HideInInspector] public AudioSource audioSource;
}

1 Ответ

0 голосов
/ 06 апреля 2020

Когда объект является DontDestroyOnLoad объектом, он теряет все свои переменные.

Ваше решение: (Это также намного проще и понятнее, и вам также не нужен другой скрипт )

public class AudioManager : MonoBehaviour
{
    public static AudioSource;
    public static AudioClip clip1, clip2;
    void Awake()
    {
        GameObject[] obj = GameObject.FindGameObjectsWithTag(gameobject.tag);
        if (obj.length > 1)
            Destroy(gameobject);



        DontDestroyOnLoad(gameObject);

        //Make sure your audioClips are in a folder called "Resources"!!!
        //Put the name of the audio clip in the ""
        clip1 = Resources.Load<AudioClip>("clip1");
        clip2 = Resources.Load<AudioClip>("clip2");
    }

    void Update()
    {
        //Make sure that the gameObject with this script has an audioSource component!
        if (!audioSource)
            audioSource = GetComponent<AudioSource>();
    }
    //now you can simply call this function from another script using AudioManager.Play("name")
    public static void Play(string name)
    {
        switch (name)
        {
            case "clip1":
                audioSource.PlayOneShot(clip1);
                break;
            case "clip2":
                audioSource.PlayOneShot(clip2);
                break;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...