Controlar el número de efectos de sonido simultáneos reproducidos

Actualización de la página :
Fecha de creación de la página :

Entorno de verificación

Windows
  • Ventanas 11
Unity Editor
  • 2021.3.3F1
Paquete del sistema de entrada
  • 1.3.0

Requisitos previos para esta sugerencia

Los siguientes ajustes se han realizado de antemano como premisa para la descripción de este consejo.

Sobre el material incluido con la muestra

Los efectos de sonido se toman prestados de los siguientes sitios.

Acerca de los archivos de audio

Los siguientes formatos de archivo de audio se pueden reproducir con las funciones estándar de Unity: Por favor, prepárelo con anticipación porque se utilizará en estos consejos.

  • WAV (.wav)
  • OggVorbis (.ogg)
  • MPEG capa 3 (.mp3)

Para obtener más información, consulta la documentación oficial de Unity.

Acerca del límite superior y el volumen de la reproducción simultánea de audio múltiple

En los consejos anteriores, AudioClip ahora es posible reproducir varias voces reproduciéndolas mientras se preparan AudioSource.PlayOneShot los datos de audio en . Sin embargo, no hay límite para la cantidad de juegos que se pueden jugar, por lo que si no lo limita durante el juego, se puede reproducir mucho sonido y se puede reproducir un volumen alto.

Aquí me gustaría crear mi propio programa y controlar el número de efectos de sonido que se pueden reproducir al mismo tiempo.

Crear el ejemplo

Esta vez, el efecto de sonido se reproducirá cada vez que haga clic en el botón, así que cree la interfaz de usuario como se muestra en la figura. Los detalles son apropiados y buenos.

Suelte y agregue el archivo de audio que desea reproducir en su proyecto.

Hasta la última vez, la función AudioSource estándar de se agregó a la jerarquía, Esta vez, agregaremos un script porque pondremos nuestro propio control. SoundPlayManager Deje el nombre como .

Cree el script de la siguiente manera:

using System.Collections.Generic;
using UnityEngine;

/// <summary>音声再生管理クラスです。</summary>
public class SoundPlayManager : MonoBehaviour
{
  /// <summary>1つの種類の音声の再生情報を保持するクラスです。</summary>
  private class PlayInfo
  {
    /// <summary>再生している AudioSource の一覧です。</summary>
    public AudioSource[] AudioSource { get; set; }

    /// <summary>現在の再生インデックスです。</summary>
    public int NowIndex { get; set; }
  }

  /// <summary>再生しようとしている音声データのキューです。</summary>
  private HashSet<AudioClip> Queue = new HashSet<AudioClip>();

  /// <summary>再生している音声を管理している一覧です。</summary>
  private Dictionary<AudioClip, PlayInfo> Sources = new Dictionary<AudioClip, PlayInfo>();

  /// <summary>
  /// 同一音声同時再生最大数。
  /// </summary>
  [SerializeField, Range(1, 32)] private int MaxSimultaneousPlayCount = 2;

  protected void Update()
  {
    foreach (var item in Queue)
    {
      AudioSource source;
      if (Sources.ContainsKey(item) == false)
      {
        // 一度も再生されていない Clip がある場合は PlayInfo を生成します
        var info = new PlayInfo()
        {
          AudioSource = new AudioSource[MaxSimultaneousPlayCount],
        };
        for (int i = 0; i < MaxSimultaneousPlayCount; i++)
        {
          var s = gameObject.AddComponent<AudioSource>();
          s.clip = item;
          info.AudioSource[i] = s;
        }
        Sources.Add(item, info);
        source = info.AudioSource[0];
      }
      else
      {
        // 再生に使用する AudioSource を順番に取得します
        var info = Sources[item];
        info.NowIndex = (info.NowIndex + 1) % MaxSimultaneousPlayCount;
        source = info.AudioSource[info.NowIndex];
      }

      source.Play();
    }
    Queue.Clear();
  }

  /// <summary>
  /// 効果音を再生します。
  /// </summary>
  public void Play(AudioClip clip)
  {
    // 同一フレームで複数再生しないようにすでにキューに入っているか確認します
    if (Queue.Contains(clip) == false)
    {
      Queue.Add(clip);
    }
  }

  public void OnDestroy()
  {
    // 不要になった参照をすべて外します
    foreach (var source in Sources)
    {
      source.Value.AudioSource = null;
    }
    Sources.Clear();
    Queue.Clear();
  }
}

Dado que el script es largo, se omite una explicación detallada, pero tiene las siguientes funciones.

  • AudioClip Puede reproducir audio pasando
  • Cuando se reproduce el mismo tipo de audio uno encima del otro, si intenta reproducir más de un cierto número de voces, los datos de reproducción antiguos se detienen (el valor inicial es de hasta 2 reproducciones).
  • No se permite la reproducción superpuesta en el mismo fotograma

Esto evita que el volumen aumente cuando se reproduce el mismo audio de forma consecutiva. En términos de funcionalidad, solo se incluye el mínimo, así que agréguelo si lo necesita.

El script se adjunta a EventSystem.

A continuación, cree un script para el botón.

Cree el script de la siguiente manera:

using UnityEngine;

public class ButtonEvent : MonoBehaviour
{
  /// <summary>再生する音声データ。</summary>
  [SerializeField] private AudioClip AudioClip;

  /// <summary>自作した音声再生管理クラス。</summary>
  [SerializeField] private SoundPlayManager SoundPlayManager;

  /// <summary>ボタンをクリックしたとき。</summary>
  public void OnClick()
  {
    SoundPlayManager.Play(AudioClip);
  }
}

El proceso de reproducción lo realiza el propio hecho SoundPlayManager , por lo que en el evento del botón, simplemente pase los datos de audio y reprodúzcalos.

El script se adjunta a EventSystem. La gestión de adjuntos no es el tema principal de estos consejos, por lo que es apropiado.

Para el clip de audio, configure el archivo de audio que se va a reproducir. Establezca el Administrador de reproducción de sonido en el SoundPlayManager objeto al que está conectando. Como nos estamos adjuntando al EventSystem, estableceremos el EventSystem.

Finalmente, asigne al botón haga clic en el OnClick evento.

Ejecuta el juego cuando hayas terminado. De forma predeterminada, el número máximo de reproducciones simultáneas se establece en 2, así que vuelva a hacer clic en el botón mientras se reproducen dos sonidos y asegúrese de que el primer sonido desaparezca.

El programa creado esta vez tiene un límite superior en el número de tiempos de reproducción para cada tipo de sonido, por lo que suena natural incluso si entrelaza otros efectos de sonido. Sin embargo, dependiendo del tipo de sonido, el límite superior de 2 puede no ser suficiente, por lo que puede ser una buena idea poder establecer un límite superior para cada tipo de sonido. Bueno, no sé si existe tal oportunidad de superponer el sonido, pero ...