Ελέγξτε τον αριθμό των ταυτόχρονων ηχητικών εφέ που αναπαράγονται
Περιβάλλον επαλήθευσης
- παράθυρα
-
- Παράθυρα 11
- Επεξεργαστής ενότητας
-
- 2021.3.3στ1
- Πακέτο συστήματος εισόδου
-
- 1.3.0
Προϋποθέσεις για αυτήν τη συμβουλή
Οι ακόλουθες ρυθμίσεις έχουν γίνει εκ των προτέρων ως προϋπόθεση για την περιγραφή αυτής της συμβουλής.
Σχετικά με το υλικό που περιλαμβάνεται στο δείγμα
Τα ηχητικά εφέ δανείζονται από τους ακόλουθους ιστότοπους.
Πληροφορίες για τα αρχεία ήχου
Οι ακόλουθες μορφές αρχείων ήχου μπορούν να αναπαραχθούν με τα τυπικά χαρακτηριστικά του Unity: Προετοιμάστε το εκ των προτέρων γιατί θα χρησιμοποιηθεί σε αυτές τις συμβουλές.
- WAV (.wav)
- OggVorbis (.ogg)
- MPEG επίπεδο 3 (.mp3)
Για περισσότερες πληροφορίες, ανατρέξτε στην επίσημη τεκμηρίωση του Unity.
Πληροφορίες σχετικά με το ανώτατο όριο και την ένταση της πολλαπλής ταυτόχρονης αναπαραγωγής ήχου
Στις προηγούμενες συμβουλές, AudioClip
είναι πλέον δυνατή η αναπαραγωγή πολλών φωνών αναπαράγοντάς τις κατά την προετοιμασία AudioSource.PlayOneShot
δεδομένων ήχου στο .
Ωστόσο, δεν υπάρχει όριο στον αριθμό των παιχνιδιών που μπορούν να παιχτούν, οπότε αν δεν το περιορίσετε κατά τη διάρκεια του παιχνιδιού, μπορεί να παιχτεί πολύς ήχος και να παιχτεί δυνατή ένταση.
Εδώ θα ήθελα να δημιουργήσω το δικό μου πρόγραμμα και να ελέγξω τον αριθμό των ηχητικών εφέ που μπορούν να αναπαραχθούν ταυτόχρονα.
Δημιουργία του δείγματος
Αυτή τη φορά, το ηχητικό εφέ θα αναπαράγεται κάθε φορά που κάνετε κλικ στο κουμπί, οπότε δημιουργήστε τη διεπαφή χρήστη όπως φαίνεται στην εικόνα. Οι λεπτομέρειες είναι κατάλληλες και καλές.
Αποθέστε και προσθέστε το αρχείο ήχου που θέλετε να αναπαραγάγετε στο έργο σας.
Μέχρι την τελευταία φορά, η τυπική λειτουργία AudioSource
του προστέθηκε στην ιεραρχία,
Αυτή τη φορά, θα προσθέσουμε ένα σενάριο γιατί θα βάλουμε τον δικό μας έλεγχο.
SoundPlayManager
Αφήστε το όνομα ως .
Δημιουργήστε τη δέσμη ενεργειών ως εξής:
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();
}
}
Δεδομένου ότι το σενάριο είναι μεγάλο, η λεπτομερής εξήγηση παραλείπεται, αλλά έχει τις ακόλουθες λειτουργίες.
AudioClip
Μπορείτε να αναπαράγετε ήχο περνώντας- Όταν ο ίδιος τύπος ήχου αναπαράγεται ο ένας πάνω στον άλλο, εάν προσπαθήσετε να αναπαράγετε περισσότερες από έναν ορισμένο αριθμό φωνών, τα παλιά δεδομένα αναπαραγωγής σταματούν (η αρχική τιμή είναι έως 2 αναπαραγωγές).
- Δεν επιτρέπεται η αλληλεπικαλυπτόμενη αναπαραγωγή στο ίδιο καρέ
Αυτό αποτρέπει την αύξηση της έντασης ήχου όταν ο ίδιος ήχος αναπαράγεται διαδοχικά. Όσον αφορά τη λειτουργικότητα, περιλαμβάνεται μόνο το ελάχιστο, οπότε προσθέστε το εάν το χρειάζεστε.
Η δέσμη ενεργειών επισυνάπτεται στο EventSystem.
Στη συνέχεια, δημιουργήστε ένα σενάριο για το κουμπί.
Δημιουργήστε τη δέσμη ενεργειών ως εξής:
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);
}
}
Η διαδικασία αναπαραγωγής γίνεται από τον αυτοδημιούργητο SoundPlayManager
, οπότε στο συμβάν κουμπιού, απλώς περάστε τα δεδομένα ήχου και παίξτε τα.
Η δέσμη ενεργειών επισυνάπτεται στο EventSystem. Η διαχείριση επισύναψης δεν είναι το κύριο θέμα αυτών των συμβουλών, επομένως είναι κατάλληλο.
Για το ηχητικό κλιπ, ορίστε το αρχείο ήχου που θα αναπαραχθεί.
Ρυθμίστε τη Διαχείριση αναπαραγωγής ήχου στο αντικείμενο στο SoundPlayManager
οποίο συνδέεστε.
Δεδομένου ότι συνδέουμε το EventSystem, θα ορίσουμε το EventSystem.
Τέλος, αντιστοιχίστε στο συμβάν κλικ κουμπιού OnClick
.
Εκτελέστε το παιχνίδι όταν τελειώσετε. Από προεπιλογή, ο μέγιστος αριθμός ταυτόχρονων αναπαραγωγών έχει οριστεί σε 2, επομένως κάντε ξανά κλικ στο κουμπί ενώ αναπαράγονται δύο ήχοι και βεβαιωθείτε ότι ο πρώτος ήχος εξαφανίζεται.
Το πρόγραμμα που δημιουργήθηκε αυτή τη φορά έχει ένα ανώτατο όριο στον αριθμό των χρόνων αναπαραγωγής για κάθε τύπο ήχου, οπότε ακούγεται φυσικό ακόμα κι αν συνυφαίνετε άλλα ηχητικά εφέ. Ωστόσο, ανάλογα με τον τύπο του ήχου, το ανώτατο όριο του 2 μπορεί να μην είναι αρκετό, οπότε μπορεί να είναι καλή ιδέα να μπορείτε να ορίσετε ένα ανώτατο όριο για κάθε τύπο ήχου. Λοιπόν, δεν ξέρω αν υπάρχει μια τέτοια ευκαιρία να στρώσει τον ήχο, αλλά ...