Kontroller antallet af samtidige lydeffekter, der afspilles

Side opdateret :
Dato for oprettelse af side :

Miljø til bekræftelse

Windows
  • Windows 11
Enhedslistens redaktør
  • 2021.3.3f1
Input System Pakke
  • 1.3.0

Forudsætninger for dette tip

Følgende indstillinger er foretaget på forhånd som en forudsætning for beskrivelsen af dette tip.

Om det materiale, der følger med prøven

Lydeffekter lånes fra følgende websteder.

Om lydfiler

Følgende lydfilformater kan afspilles med Unitys standardfunktioner: Forbered det på forhånd, fordi det vil blive brugt i disse tip.

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

Du kan finde flere oplysninger i den officielle Unity-dokumentation.

Om den øvre grænse og lydstyrke for flere samtidige lydafspilninger

I de tidligere tip er det nu muligt at afspille flere stemmer ved at afspille dem, AudioClip mens du forbereder AudioSource.PlayOneShot lyddata i . Der er dog ingen grænse for antallet af spil, der kan spilles, så hvis du ikke begrænser det under spillet, kan der afspilles meget lyd, og der kan afspilles en høj lydstyrke.

Her vil jeg gerne oprette mit eget program og styre antallet af lydeffekter, der kan afspilles på samme tid.

Opret eksemplet

Denne gang afspilles lydeffekten, hver gang du klikker på knappen, så opret brugergrænsefladen som vist på figuren. Detaljerne er passende og gode.

Slip og tilføj den lydfil, du vil afspille i dit projekt.

Indtil sidste gang blev standardfunktionen AudioSource af tilføjet til hierarkiet, Denne gang tilføjer vi et script, fordi vi sætter vores egen kontrol. SoundPlayManager Lad navnet være .

Opret scriptet som følger:

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 scriptet er langt, udelades detaljeret forklaring, men det har følgende funktioner.

  • AudioClip Du kan afspille lyd ved at passere
  • Når den samme type lyd afspilles oven på hinanden, hvis du forsøger at afspille mere end et bestemt antal stemmer, stopper de gamle afspilningsdata (startværdien er op til 2 afspilninger).
  • Overlappende afspilning på samme billede er ikke tilladt

Dette forhindrer lydstyrken i at stige, når den samme lyd afspilles back-to-back. Med hensyn til funktionalitet er kun minimumet inkluderet, så tilføj det, hvis du har brug for det.

Scriptet er knyttet til EventSystem.

Opret derefter et script til knappen.

Opret scriptet som følger:

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

Afspilningsprocessen udføres af den selvfremstillede SoundPlayManager , så i knapbegivenheden skal du bare videregive lyddataene og afspille dem.

Scriptet er knyttet til EventSystem. Vedhæft ledelse er ikke hovedemnet for dette tip, så det er passende.

For lydklippet skal du indstille lydfilen, der skal afspilles. Indstil Sound Play Manager til det SoundPlayManager objekt, du er tilsluttet. Da vi er tilknyttet EventSystem, indstiller vi EventSystem.

Til sidst skal du tildele OnClick knappen klik begivenhed.

Kør spillet, når du er færdig. Som standard er det maksimale antal samtidige afspilninger indstillet til 2, så klik på knappen igen, mens to lyde afspilles, og sørg for, at den første lyd forsvinder.

Programmet oprettet denne gang har en øvre grænse for antallet af afspilningstider for hver type lyd, så det lyder naturligt, selvom du sammenfletter andre lydeffekter. Afhængigt af lydtypen er den øvre grænse på 2 muligvis ikke nok, så det kan være en god idé at kunne indstille en øvre grænse for hver lydtype. Nå, jeg ved ikke, om der er en sådan mulighed for at lægge lyden i lag, men ...