Steuern Sie die Anzahl der gleichzeitig abgespielten Soundeffekte

Diese Seite wurde aktualisiert :
Erstellungsdatum der Seite :

Verifizierungsumgebung

Fenster
  • Windows 11
Unity-Editor
  • 2021.3.3f1
Eingabesystem-Paket
  • 1.3.0

Voraussetzungen für diesen Tipp

Die folgenden Einstellungen wurden im Vorfeld als Prämisse für die Beschreibung dieses Tipps vorgenommen.

Über das Material, das in der Probe enthalten ist

Soundeffekte sind von den folgenden Seiten ausgeliehen.

Informationen zu Audiodateien

Die folgenden Audiodateiformate können mit den Standardfunktionen von Unity wiedergegeben werden: Bitte bereiten Sie es im Voraus vor, da es in diesen Tipps verwendet wird.

  • WAV (.wav)
  • OggVorbis (.ogg)
  • MPEG-Schicht 3 (.mp3)

Weitere Informationen finden Sie in der offiziellen Unity-Dokumentation.

Informationen zur Obergrenze und Lautstärke mehrerer gleichzeitiger Audiowiedergaben

In den vorherigen Tipps ist es jetzt möglich, mehrere Stimmen abzuspielen, indem Sie sie abspielen, AudioClip während AudioSource.PlayOneShot Sie Audiodaten in vorbereiten. Es gibt jedoch keine Begrenzung für die Anzahl der Spiele, die gespielt werden können, wenn Sie sie also während des Spiels nicht begrenzen, kann viel Ton abgespielt und eine laute Lautstärke gespielt werden.

Hier möchte ich mein eigenes Programm erstellen und die Anzahl der Soundeffekte steuern, die gleichzeitig abgespielt werden können.

Erstellen des Beispiels

Dieses Mal wird der Soundeffekt jedes Mal abgespielt, wenn Sie auf die Schaltfläche klicken, also erstellen Sie die Benutzeroberfläche wie in der Abbildung gezeigt. Die Details sind angemessen und gut.

Legen Sie die Audiodatei, die Sie abspielen möchten, ab und fügen Sie sie Ihrem Projekt hinzu.

Bis zum letzten Mal wurde die Standardfunktion AudioSource von zur Hierarchie hinzugefügt, Dieses Mal fügen wir ein Skript hinzu, da wir unsere eigene Kontrolle festlegen werden. SoundPlayManager Lassen Sie den Namen als .

Erstellen Sie das Skript wie folgt:

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

Da das Skript lang ist, wird auf eine detaillierte Erklärung verzichtet, aber es hat die folgenden Funktionen.

  • AudioClip Sie können Audio abspielen, indem Sie
  • Wenn derselbe Audiotyp übereinander abgespielt wird und Sie versuchen, mehr als eine bestimmte Anzahl von Stimmen wiederzugeben, werden die alten Wiedergabedaten gestoppt (der Anfangswert beträgt bis zu 2 Wiedergaben).
  • Eine überlappende Wiedergabe im selben Frame ist nicht zulässig

Dadurch wird verhindert, dass die Lautstärke zunimmt, wenn derselbe Ton hintereinander wiedergegeben wird. In Bezug auf die Funktionalität ist nur das Minimum enthalten, also fügen Sie es bitte hinzu, wenn Sie es benötigen.

Das Skript ist an EventSystem angehängt.

Erstellen Sie als Nächstes ein Skript für die Schaltfläche.

Erstellen Sie das Skript wie folgt:

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

Der Wiedergabevorgang wird vom Selfmade SoundPlayManager selbst durchgeführt, also im Button-Event einfach die Audiodaten übergeben und abspielen.

Das Skript ist an EventSystem angehängt. Die Verwaltung von Anhängen ist nicht das Hauptthema dieser Tipps, daher ist sie angemessen.

Legen Sie für den Audioclip die Audiodatei fest, die wiedergegeben werden soll. Stellen Sie den Soundwiedergabe-Manager auf das Objekt ein, an das SoundPlayManager Sie ihn anhängen möchten. Da wir an das EventSystem anhängen, werden wir das EventSystem festlegen.

Weisen Sie abschließend dem OnClick Schaltflächenklickereignis zu.

Führe das Spiel aus, wenn du fertig bist. Standardmäßig ist die maximale Anzahl gleichzeitiger Wiedergaben auf 2 eingestellt, also klicken Sie bitte erneut auf die Schaltfläche, während zwei Sounds abgespielt werden, und stellen Sie sicher, dass der erste Ton verschwindet.

Das Programm, das dieses Mal erstellt wurde, hat eine Obergrenze für die Anzahl der Wiedergabezeiten für jede Art von Sound, sodass es auch dann natürlich klingt, wenn Sie andere Soundeffekte miteinander verweben. Abhängig von der Art des Klangs reicht die Obergrenze von 2 jedoch möglicherweise nicht aus, daher kann es eine gute Idee sein, für jede Art von Klang eine Obergrenze festlegen zu können. Nun, ich weiß nicht, ob es eine solche Möglichkeit gibt, den Sound zu schichten, aber ...