Oynatılan eşzamanlı ses efektlerinin sayısını kontrol edin

Sayfa güncel :
Sayfa oluşturma tarihi :

Doğrulama ortamı

Windows
  • Pencereler 11
Birlik Editörü
  • 2021.3.3f1
Giriş Sistemi Paketi
  • 1.3.0

Bu ipucu için önkoşullar

Aşağıdaki ayarlar, bu ipucunun açıklaması için bir öncül olarak önceden yapılmıştır.

Numuneye dahil edilen malzeme hakkında

Ses efektleri aşağıdaki sitelerden ödünç alınmıştır.

Ses dosyaları hakkında

Aşağıdaki ses dosyası formatları Unity'nin standart özellikleriyle çalınabilir: Lütfen önceden hazırlayın çünkü bu ipuçlarında kullanılacaktır.

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

Daha fazla bilgi için resmi Unity belgelerine bakın.

Aynı anda birden fazla ses çalmanın üst sınırı ve ses düzeyi hakkında

Önceki ipuçlarında, AudioClip ses verilerini hazırlarken AudioSource.PlayOneShot birden fazla sesi çalarak çalmak artık mümkündür. Bununla birlikte, oynanabilecek oyun sayısında bir sınır yoktur, bu nedenle oyun sırasında sınırlamazsanız, çok fazla ses çalınabilir ve yüksek bir ses seviyesi çalınabilir.

Burada kendi programımı oluşturmak ve aynı anda çalınabilecek ses efektlerinin sayısını kontrol etmek istiyorum.

Örneği oluşturma

Bu kez, düğmeye her tıkladığınızda ses efekti çalacaktır, bu nedenle kullanıcı arayüzünü şekilde gösterildiği gibi oluşturun. Detaylar uygun ve iyi.

Çalmak istediğiniz ses dosyasını bırakın ve projenize ekleyin.

Son sefere kadar, standart fonksiyon AudioSource hiyerarşiye eklendi, Bu sefer bir script ekleyeceğiz çünkü kendi kontrolümüzü koyacağız. SoundPlayManager Adı olarak bırakın.

Komut dosyasını aşağıdaki gibi oluşturun:

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

Komut dosyası uzun olduğundan, ayrıntılı açıklama atlanır, ancak aşağıdaki işlevlere sahiptir.

  • AudioClip Geçerek ses çalabilirsiniz
  • Aynı ses türü üst üste çalındığında, belirli bir sayıdan fazla ses çalmaya çalışırsanız, eski çalma verileri durur (başlangıç değeri en fazla 2 kayıttan yürütmedir).
  • Aynı karede çakışan oynatmaya izin verilmez

Bu, aynı ses arka arkaya çalındığında ses düzeyinin artmasını önler. İşlevsellik açısından, yalnızca minimum dahil edilmiştir, bu nedenle ihtiyacınız olursa lütfen ekleyin.

Komut dosyası EventSystem'e eklenir.

Ardından, düğme için bir komut dosyası oluşturun.

Komut dosyasını aşağıdaki gibi oluşturun:

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

Oynatma işlemi kendi kendini yapan SoundPlayManager kişi tarafından yapılır, bu nedenle düğme olayında, ses verilerini geçirin ve çalın.

Komut dosyası EventSystem'e eklenir. Ekleme yönetimi bu İpuçlarının ana konusu değildir, bu nedenle uygundur.

Ses klibi için, çalınacak ses dosyasını ayarlayın. Ses Çalma Yöneticisi'ni SoundPlayManager eklediğiniz nesneye ayarlayın. EventSystem'e eklediğimizden, EventSystem'i ayarlayacağız.

Son olarak, düğme tıklama olayına OnClick atayın.

İşiniz bittiğinde oyunu çalıştırın. Varsayılan olarak, maksimum eşzamanlı çalma sayısı 2 olarak ayarlanmıştır, bu nedenle iki ses çalarken lütfen düğmeye tekrar tıklayın ve ilk sesin kaybolduğundan emin olun.

Bu kez oluşturulan program, her ses türü için çalma sürelerinin sayısında bir üst sınıra sahiptir, bu nedenle diğer ses efektlerini iç içe geçirseniz bile doğal görünür. Bununla birlikte, sesin türüne bağlı olarak, 2 üst sınırı yeterli olmayabilir, bu nedenle her ses türü için bir üst sınır belirleyebilmek iyi bir fikir olabilir. Sesi katmanlamak için böyle bir fırsat olup olmadığını bilmiyorum, ama ...