Oynatılan eşzamanlı ses efektlerinin sayısını kontrol edin
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 ...