Быстрое воспроизведение одного и того же звука из одного источника в сравнении с несколькими источниками - PullRequest
0 голосов
/ 19 сентября 2019

Хорошо, позвольте мне попытаться объяснить ...

Я делаю карточную игру, где она играет звуковой эффект, когда карта добавляется в колоду, но во время настройки карты быстро добавляются в разные стопки.и он ломается, если я использую сингл Audiosource

Если я играю его с одного сингла audiosource, кажется, что он не воспроизводит их все или если он воспроизводит их все сразу.

против

Если я сделаю это, имея audiosource на каждой стопке, использую этот экземпляр и слышу различные сыгранные эффекты.

Я нахожусь всередина переписывания игры, так как первый раз был пробным, и я не знал, что мне нужно, и немного грубоват и столкнулся с этим, пытаясь упростить звук в игре, имея в своем распоряжении GameAudioManager синглтонаудио.

Есть ли для этого причина и решение?

Информация

Звуковой эффект - это MP3 и 3kb

Задержка между эффектами составляет 0.01f

1 Ответ

0 голосов
/ 19 сентября 2019

Выбор за вами на самом деле ... Хотите, чтобы они играли последовательно?достаточно одного источника звука, добавьте ожидающие клипы в очередь и удалите их из очереди по окончании текущего воспроизводимого.

Хотите, чтобы они воспроизводились по отдельности, отдельно в зависимости от события, независимо от того, была ли добавлена ​​еще одна карта иэффект все еще воспроизводился, тогда вы используете несколько источников звука.Вот отправная точка для менеджера, который воспроизводит аудио индивидуально, как они просят.

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class GameAudioManager : MonoBehaviour
{
    // your singleton pattern here, so assuming you now have an instance.
    public static GameAudioManager Instance;

    // List holds available sources that we can use to play an audio clip.
    List<AudioSource> availableSources = new List<AudioSource>();

    // Immediately plays a clip, if a cached audio source available, uses it, if none, create new.
    public static void AudioPlayOneShot(AudioClip clip, float volume, float pitch, bool loop)
    {
        Instance.StartCoroutine(Instance.StartPlayingOneShot(clip, volume, pitch, loop);
    }

    private IEnumerator StartPlayingOneShot(AudioClip clip, float volume, float pitch, bool loop)
    {
        AudioSource audioSource = GetAudioSource();
        audioSource.playOnAwake = false;
        audioSource.clip = clip;
        audioSource.volume = volume;
        audioSource.pitch = pitch;
        audioSource.loop = loop;

        audioSource.Play();
        while (audioSource.isPlaying)
            yield return null;

        // Whenever this clip stops, add it back to available cache.
        CacheAudioSource(audioSource);
    }

    private void CacheAudioSource(AudioSource audioSource)
    {
        audioSource.clip = null;
        audioSource.playOnAwake = false;
        availableSources.Add(audioSource);
    }
    /// <summary>
    /// Gets an audio source from cached list or creates a new one if none available.
    /// </summary>
    /// <returns></returns>
    private AudioSource GetAudioSource()
    {
        if (availableSources == null || availableSources.Count == 0)
            return this.gameObject.AddComponent<AudioSource>();
        else
        {
            AudioSource fromCache = availableSources[0];
            availableSources.RemoveAt(0);
            return fromCache;
        }
    }
}

Используйте как

GameAudioManager.AudioPlayOneShot(yourClip, yourVolume, yourPitch, loop);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...