【问题标题】:Playing the same sound rapidly from a single audiosource vs multiple audiosources从单个音频源与多个音频源快速播放相同的声音
【发布时间】:2020-01-20 16:25:01
【问题描述】:

好吧,让我试着解释一下……

我正在制作一个纸牌游戏,当将纸牌添加到一堆时它会播放声音效果,但在设置过程中,纸牌会迅速添加到不同的牌堆中,如果我使用单个 Audiosource 它会中断

如果我从单个 audiosource 播放它,它似乎不会全部播放,或者如果它是一次播放它们。

对比

如果我在每一堆上都有一个audiosource 并使用它的实例并听到播放的不同效果。

我正在重写游戏,因为第一次是试运行,不知道我需要什么,有点粗糙,在尝试通过简化游戏音频时遇到了这个问题一个 GameAudioManager 单例来处理音频。

这有什么原因和解决办法吗?

信息

音效是 MP3 和 3kb

效果之间的延迟为 0.01f

【问题讨论】:

    标签: unity3d


    【解决方案1】:

    其实你的选择... 想让他们按顺序播放吗?一个音频源就足够了,将待处理的剪辑添加到队列中,并在当前播放结束时将它们出列。

    希望它们在事件发生时单独播放,无论是否刚刚添加了另一张卡并且其效果仍在播放,然后您使用多个音频源。 以下是根据要求单独播放音频的经理的起点。

    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);
    

    【讨论】:

    • 谢谢,但这会让声音效果与屏幕上发生的事情不同步。此外,我现在认为 Unity 做了一些事情,因为我使用的新版本比我用于原始项目的新版本。
    【解决方案2】:

    它不起作用的原因是 AudioSource 只能播放一个自身的实例,因此如果它已经在播放,则无法开始新的播放。

    解决方案是根据需要对它们进行实例化,或者将其放在每个项目上并能够从这些单独的 AudioSource 播放它。

    希望这可以帮助其他遇到此问题的人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多