Bepaal het aantal gelijktijdig afgespeelde geluidseffecten

Pagina bijgewerkt :
Aanmaakdatum van pagina :

Verificatieomgeving

Ramen
  • Voor Windows 11
Unity Editor
  • 2021.3.3f1
Input systeem pakket
  • 1.3.0

Vereisten voor deze tip

De volgende instellingen zijn vooraf gemaakt als uitgangspunt voor de beschrijving van deze tip.

Over het materiaal dat bij het monster is geleverd

Geluidseffecten zijn geleend van de volgende sites.

Informatie over audiobestanden

De volgende audiobestandsindelingen kunnen worden afgespeeld met de standaardfuncties van Unity: Bereid het van tevoren voor, want het zal in deze tips worden gebruikt.

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

Zie voor meer informatie de officiële Unity-documentatie.

Over de bovengrens en het volume van meerdere gelijktijdige audioweergaven

In de vorige tips AudioClip is het nu mogelijk om meerdere stemmen af te spelen door ze af te spelen tijdens het voorbereiden van AudioSource.PlayOneShot audiogegevens in . Er is echter geen limiet aan het aantal spellen dat kan worden gespeeld, dus als u het tijdens het spel niet beperkt, kan er veel geluid worden afgespeeld en kan er een luid volume worden afgespeeld.

Hier wil ik mijn eigen programma maken en het aantal geluidseffecten regelen dat tegelijkertijd kan worden afgespeeld.

Het voorbeeld maken

Deze keer wordt het geluidseffect afgespeeld telkens wanneer u op de knop klikt, dus maak de gebruikersinterface zoals weergegeven in de afbeelding. De details zijn passend en goed.

Zet het audiobestand dat u wilt afspelen neer en voeg het toe aan uw project.

Tot de vorige keer werd de standaardfunctie AudioSource van toegevoegd aan de hiërarchie, Deze keer voegen we een script toe omdat we onze eigen controle geven. SoundPlayManager Laat de naam staan als .

Maak het script als volgt:

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

Omdat het script lang is, wordt gedetailleerde uitleg weggelaten, maar het heeft de volgende functies.

  • AudioClip U kunt audio afspelen door te passeren
  • Wanneer hetzelfde type audio op elkaar wordt afgespeeld en u meer dan een bepaald aantal stemmen probeert af te spelen, stoppen de oude afspeelgegevens (de beginwaarde is maximaal 2 weergaven).
  • Overlappend afspelen op hetzelfde frame is niet toegestaan

Dit voorkomt dat het volume toeneemt wanneer dezelfde audio back-to-back wordt afgespeeld. Qua functionaliteit is alleen het minimum inbegrepen, dus voeg het toe als je het nodig hebt.

Het script is gekoppeld aan EventSystem.

Maak vervolgens een script voor de knop.

Maak het script als volgt:

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

Het afspeelproces wordt gedaan door de selfmade SoundPlayManager zelf, dus in het knoppengebeurtenis, geef gewoon de audiogegevens door en speel deze af.

Het script is gekoppeld aan EventSystem. Attach management is niet het hoofdonderwerp van deze Tips, dus het is gepast.

Stel voor de audioclip het audiobestand in dat moet worden afgespeeld. Stel Sound Play Manager in op het SoundPlayManager object waaraan u koppelt. Omdat we ons hechten aan het EventSystem, zullen we het EventSystem instellen.

Wijs ten slotte aan de OnClick knop klikgebeurtenis toe.

Voer de game uit als je klaar bent. Standaard is het maximale aantal gelijktijdige weergaven ingesteld op 2, dus klik nogmaals op de knop terwijl er twee geluiden worden afgespeeld en zorg ervoor dat het eerste geluid verdwijnt.

Het programma dat deze keer is gemaakt, heeft een bovengrens voor het aantal afspeeltijden voor elk type geluid, dus het klinkt natuurlijk, zelfs als u andere geluidseffecten verweeft. Afhankelijk van het type geluid is de bovengrens van 2 echter mogelijk niet voldoende, dus het kan een goed idee zijn om voor elk type geluid een bovengrens in te stellen. Nou, ik weet niet of er zo'n mogelijkheid is om het geluid te gelaagd, maar ...