Controlar el nombre d'efectes de so simultanis reproduïts

Pàgina actualitzada :
Data de creació de la pàgina :

Entorn de verificació

Windows
  • Finestres 11
Editor d'unitat
  • 2021.3.3f1
Paquet del sistema d'entrada
  • 1.3.0

Requisits previs per a aquest consell

La configuració següent s'ha fet amb antelació com a premissa per a la descripció d'aquest consell.

Sobre el material inclòs en la mostra

Els efectes de so es prenen prestats dels llocs següents.

Quant als fitxers d'àudio

Els següents formats de fitxer d'àudio es poden reproduir amb les característiques estàndard d'Unity: Si us plau, prepareu-lo amb antelació perquè s'utilitzarà en aquests consells.

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

Per obtenir més informació, consulteu la documentació oficial de la Unitat.

Sobre el límit superior i el volum de la reproducció simultània d'àudio múltiple

En els consells anteriors, AudioClip ara és possible reproduir diverses veus reproduint-les mentre prepareu AudioSource.PlayOneShot dades d'àudio a . No obstant això, no hi ha límit en el nombre de jocs que es poden jugar, de manera que si no es limita durant el joc, es pot reproduir molt so i es pot reproduir un volum fort.

Aquí m'agradaria crear el meu propi programa i controlar el nombre d'efectes de so que es poden reproduir al mateix temps.

Crea la mostra

Aquesta vegada, l'efecte de so es reproduirà cada vegada que feu clic al botó, de manera que creeu la interfície d'usuari tal com es mostra a la figura. Els detalls són adequats i bons.

Deixeu anar i afegiu el fitxer d'àudio que voleu reproduir al vostre projecte.

Fins a l'última vegada, la funció AudioSource estàndard de s'afegia a la jerarquia, Aquesta vegada, afegirem un guió perquè posarem el nostre propi control. SoundPlayManager Deixeu el nom com .

Creeu l'script de la manera següent:

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

Com que el guió és llarg, s'omet una explicació detallada, però té les funcions següents.

  • AudioClip Podeu reproduir àudio passant
  • Quan es reprodueix el mateix tipus d'àudio l'un sobre l'altre, si intentes reproduir més d'un nombre determinat de veus, les dades de reproducció antigues s'aturen (el valor inicial és de fins a 2 reproduccions).
  • No es permet la reproducció superposada al mateix marc

Això evita que el volum augmenti quan es reprodueix el mateix àudio consecutivament. Pel que fa a la funcionalitat, només s'inclou el mínim, així que si us plau, afegiu-lo si ho necessiteu.

L'script s'adjunta a EventSystem.

A continuació, creeu un script per al botó.

Creeu l'script de la manera següent:

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 procés de reproducció el fa un mateix, de SoundPlayManager manera que en l'esdeveniment del botó, només cal passar les dades d'àudio i reproduir-les.

L'script s'adjunta a EventSystem. La gestió adjunta no és el tema principal d'aquest Consell, per la qual cosa és adequat.

Per al clip d'àudio, configureu l'arxiu d'àudio que es reproduirà. Definiu el Gestor de reproducció de so a l'objecte SoundPlayManager al qual us adjunteu. Com que ens adjuntem a l'EventSystem, establirem l'EventSystem.

Finalment, assigneu-lo al botó feu clic a l'esdeveniment OnClick .

Executeu el joc quan hàgiu acabat. Per defecte, el nombre màxim de reproduccions simultànies està establert a 2, de manera que torneu a fer clic al botó mentre es reprodueixen dos sons i assegureu-vos que el primer so desaparegui.

El programa creat aquesta vegada té un límit superior en el nombre de temps de reproducció per a cada tipus de so, de manera que sona natural fins i tot si entrellaceu altres efectes de so. No obstant això, depenent del tipus de so, el límit superior de 2 pot no ser suficient, per la qual cosa pot ser una bona idea poder establir un límit superior per a cada tipus de so. Bé, no sé si hi ha aquesta oportunitat de capes de so, però ...