Controllare il numero di effetti sonori simultanei riprodotti

Pagina aggiornata :
Data di creazione della pagina :

Ambiente di verifica

Finestre
  • Windows 11
Unity Editor
  • 2021.3.3f1
Pacchetto del sistema di input
  • 1.3.0

Prerequisiti per questo suggerimento

Le seguenti impostazioni sono state effettuate in anticipo come premessa per la descrizione di questo suggerimento.

Informazioni sul materiale incluso nell'esempio

Gli effetti sonori sono presi in prestito dai seguenti siti.

Informazioni sui file audio

I seguenti formati di file audio possono essere riprodotti con le funzionalità standard di Unity: Si prega di prepararlo in anticipo perché verrà utilizzato in questi suggerimenti.

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

Per ulteriori informazioni, consulta la documentazione ufficiale di Unity.

Informazioni sul limite superiore e sul volume di più riproduzioni audio simultanee

Nei suggerimenti precedenti, AudioClip è ora possibile riprodurre più voci riproducendole durante la preparazione AudioSource.PlayOneShot dei dati audio in . Tuttavia, non c'è limite al numero di giochi che possono essere giocati, quindi se non lo si limita durante il gioco, potrebbe essere riprodotto un sacco di suono e potrebbe essere riprodotto un volume alto.

Qui vorrei creare il mio programma e controllare il numero di effetti sonori che possono essere riprodotti contemporaneamente.

Creare l'esempio

Questa volta, l'effetto sonoro verrà riprodotto ogni volta che si fa clic sul pulsante, quindi creare l'interfaccia utente come mostrato nella figura. I dettagli sono appropriati e buoni.

Rilascia e aggiungi il file audio che desideri riprodurre nel tuo progetto.

Fino all'ultima volta, la funzione AudioSource standard di è stata aggiunta alla gerarchia, Questa volta, aggiungeremo uno script perché metteremo il nostro controllo. SoundPlayManager Lasciare il nome come .

Creare lo script come segue:

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

Poiché lo script è lungo, la spiegazione dettagliata viene omessa, ma ha le seguenti funzioni.

  • AudioClip Puoi riprodurre l'audio passando
  • Quando lo stesso tipo di audio viene riprodotto uno sopra l'altro, se si tenta di riprodurre più di un certo numero di voci, i vecchi dati di riproduzione si interrompono (il valore iniziale è fino a 2 riproduzioni).
  • La riproduzione sovrapposta allo stesso fotogramma non è consentita

Ciò impedisce che il volume aumenti quando lo stesso audio viene riprodotto back-to-back. In termini di funzionalità, è incluso solo il minimo, quindi aggiungilo se ne hai bisogno.

Lo script è collegato a EventSystem.

Quindi, creare uno script per il pulsante.

Creare lo script come segue:

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

Il processo di riproduzione viene eseguito da se stessi SoundPlayManager , quindi nell'evento del pulsante, basta passare i dati audio e riprodurli.

Lo script è collegato a EventSystem. La gestione degli allegati non è l'argomento principale di questi suggerimenti, quindi è appropriata.

Per la clip audio, impostate il file audio da riprodurre. Impostate Sound Play Manager sull'oggetto SoundPlayManager a cui state collegando. Poiché ci stiamo collegando all'EventSystem, imposteremo l'EventSystem.

Infine, assegna al pulsante fai clic sull'evento OnClick .

Esegui il gioco quando hai finito. Per impostazione predefinita, il numero massimo di riproduzioni simultanee è impostato su 2, quindi fai di nuovo clic sul pulsante mentre sono in riproduzione due suoni e assicurati che il primo suono scompaia.

Il programma creato questa volta ha un limite superiore al numero di tempi di riproduzione per ogni tipo di suono, quindi suona naturale anche se si intrecciano altri effetti sonori. Tuttavia, a seconda del tipo di suono, il limite superiore di 2 potrebbe non essere sufficiente, quindi potrebbe essere una buona idea essere in grado di impostare un limite superiore per ogni tipo di suono. Beh, non so se c'è una tale opportunità di stratificare il suono, ma ...