Vienlaicīgu atskaņoto skaņas efektu skaita kontrole

Lapa atjaunota :
Lapas izveides datums :

Verifikācijas vide

Windows
  • Operētājsistēmā Windows 11
Vienotības redaktors
  • 2021.3.3f1
Ievades sistēmas pakete
  • 1.3.0

Priekšnoteikumi šim padomam

Tālāk norādītie iestatījumi ir veikti iepriekš kā priekšnoteikums šī padoma aprakstam.

Par paraugā iekļauto materiālu

Skaņas efekti tiek aizņemti no šādām vietnēm.

Par audio failiem

Ar Unity standarta funkcijām var atskaņot šādus audio failu formātus: Lūdzu, sagatavojiet to iepriekš, jo tas tiks izmantots šajos padomos.

  • WAV (.wav)
  • OggVorbis (.ogg)
  • MPEG 3. slānis (.mp3)

Lai iegūtu papildinformāciju, skatiet oficiālo Unity dokumentāciju.

Par vairāku vienlaicīgu audio atskaņošanas augšējo ierobežojumu un skaļumu

Iepriekšējos padomos tagad ir iespējams atskaņot vairākas balsis, atskaņojot tās, AudioClip sagatavojot AudioSource.PlayOneShot audio datus . Tomēr spēlējamo spēļu skaitam nav ierobežojumu, tādēļ, ja spēles laikā to neierobežojat, var tikt atskaņots daudz skaņas un var tikt atskaņots skaļš skaļums.

Šeit es gribētu izveidot savu programmu un kontrolēt skaņas efektu skaitu, ko var atskaņot vienlaikus.

Parauga izveide

Šoreiz skaņas efekts tiks atskaņots katru reizi, kad noklikšķināsit uz pogas, tāpēc izveidojiet lietotāja interfeisu, kā parādīts attēlā. Detaļas ir atbilstošas un labas.

Nometiet un pievienojiet audio failu, kuru vēlaties atskaņot savā projektā.

Līdz pēdējai reizei hierarhijai tika pievienota standarta funkcija AudioSource , Šoreiz mēs pievienosim skriptu, jo mēs paši kontrolēsim. SoundPlayManager Atstājiet vārdu kā .

Izveidojiet skriptu šādi:

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

Tā kā skripts ir garš, detalizēts skaidrojums tiek izlaists, bet tam ir šādas funkcijas.

  • AudioClip Varat atskaņot audio, nododot
  • Ja viena un tā paša veida audio tiek atskaņots viens virs otra, ja mēģināt atskaņot vairāk nekā noteiktu balsu skaitu, vecie atskaņošanas dati tiek pārtraukti (sākotnējā vērtība ir līdz 2 atskaņošanas reizēm).
  • Nav atļauta atskaņošana, kas pārklājas vienā kadrā

Tas novērš skaļuma palielināšanos, kad tas pats audio tiek atskaņots atpakaļ. Runājot par funkcionalitāti, ir iekļauts tikai minimums, tāpēc, lūdzu, pievienojiet to, ja jums tas ir nepieciešams.

Skripts ir pievienots EventSystem.

Pēc tam izveidojiet pogas skriptu.

Izveidojiet skriptu šādi:

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

Atskaņošanas procesu veic pašizveidots SoundPlayManager pats, tāpēc pogas notikumā vienkārši nododiet audio datus un atskaņojiet tos.

Skripts ir pievienots EventSystem. Pievienot pārvaldību nav šo padomu galvenā tēma, tāpēc tas ir piemērots.

Audioklipam iestatiet atskaņojamo audio failu. Iestatiet skaņas atskaņošanas pārvaldnieku objektam, SoundPlayManager kuram pievienojat savienojumu. Tā kā mēs pievienojamies EventSystem, mēs iestatīsim EventSystem.

Visbeidzot, piešķiriet pogas klikšķa OnClick notikumam.

Palaidiet spēli, kad esat pabeidzis. Pēc noklusējuma maksimālais vienlaicīgo atskaņojumu skaits ir iestatīts uz 2, tāpēc, lūdzu, vēlreiz noklikšķiniet uz pogas, kamēr tiek atskaņotas divas skaņas, un pārliecinieties, ka pirmā skaņa pazūd.

Šoreiz izveidotajai programmai ir augšējā robeža atskaņošanas reižu skaitam katram skaņas veidam, tāpēc tā izklausās dabiski pat tad, ja jūs sasaistāt citus skaņas efektus. Tomēr atkarībā no skaņas veida augšējā robeža 2 var nebūt pietiekama, tāpēc var būt laba ideja noteikt augšējo robežu katram skaņas veidam. Nu, es nezinu, vai ir tāda iespēja slāņot skaņu, bet ...