Samaaegsete heliefektide arvu kontrollimine

Lehekülg uuendatud :
Lehe loomise kuupäev :

Kontrollimise keskkond

Windows
  • Windows 11
Ühtsuse toimetaja
  • 2021.3.3f1
Sisendsüsteemi pakett
  • 1.3.0

Selle näpunäite eeltingimused

Selle vihje kirjeldamise eelduseks on eelnevalt tehtud järgmised sätted.

Prooviga kaasas oleva materjali kohta

Heliefektid on laenatud järgmistelt saitidelt.

Teave helifailide kohta

Unity standardfunktsioonidega saab esitada järgmisi helifailivorminguid: Palun valmistage see ette, sest seda kasutatakse nendes näpunäidetes.

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

Lisateabe saamiseks vaadake Unity ametlikku dokumentatsiooni.

Teave mitme samaaegse heli taasesituse ülempiiri ja helitugevuse kohta

Eelmistes näpunäidetes on nüüd heliandmete ettevalmistamise AudioSource.PlayOneShot ajal võimalik mängida mitut häält, AudioClip esitades neid . Siiski ei ole mängitavate mängude arv piiratud, nii et kui te seda mängu ajal ei piira, võib mängida palju heli ja mängida valju helitugevust.

Siin tahaksin luua oma programmi ja kontrollida samal ajal mängitavate heliefektide arvu.

Näidise loomine

Seekord mängib heliefekt iga kord, kui klõpsate nuppu, nii et looge kasutajaliides, nagu joonisel näidatud. Üksikasjad on asjakohased ja head.

Pukseerige ja lisage oma projekti helifail, mida soovite esitada.

Kuni viimase korrani lisati hierarhiasse standardfunktsioon AudioSource , Seekord lisame skripti, sest paneme oma kontrolli alla. SoundPlayManager Jätke nimi nimeks .

Looge skript järgmiselt:

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

Kuna skript on pikk, jäetakse üksikasjalik selgitus välja, kuid sellel on järgmised funktsioonid.

  • AudioClip Heli saate esitada möödaminnes
  • Kui sama tüüpi heli esitatakse üksteise peal, kui proovite esitada rohkem kui teatud arvu hääli, peatuvad vanad taasesitusandmed (algväärtus on kuni 2 taasesitust).
  • Kattuv taasesitus samas kaadris ei ole lubatud

See hoiab ära helitugevuse suurenemise, kui sama heli esitatakse tagasi-tagasi. Funktsionaalsuse osas on lisatud ainult miinimum, nii et palun lisage see, kui seda vajate.

Skript on lisatud EventSystemile.

Seejärel looge nupule skript.

Looge skript järgmiselt:

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

Taasesitusprotsessi teeb isetehtud SoundPlayManager isetehtud, nii et nupuüritusel edastage lihtsalt heliandmed ja esitage need.

Skript on lisatud EventSystemile. Attach management ei ole selle nõuande peamine teema, seega on see asjakohane.

Heliklipi jaoks seadke esitatavaks helifail. Seadke Sound Play Manager objektile, SoundPlayManager millele olete lisatud. Kuna oleme lisatud EventSystemile, määrame EventSystemi.

Lõpuks määrake nupuvajutuse OnClick sündmusele.

Käivitage mäng, kui olete lõpetanud. Vaikimisi on samaaegsete esituste maksimaalseks arvuks seatud 2, nii et klõpsake kahe heli esitamise ajal uuesti nuppu ja veenduge, et esimene heli kaob.

Seekord loodud programmil on iga helitüübi taasesitusaegade ülempiir, nii et see kõlab loomulikuna isegi siis, kui põimite teisi heliefekte. Sõltuvalt heli tüübist ei pruugi 2 ülempiir siiski olla piisav, seega võib olla hea mõte seada igale helitüübile ülempiir. Noh, ma ei tea, kas on olemas selline võimalus heli kihistamiseks, kuid ...