שלוט במספר האפקטים הקוליים המושמעים בו זמנית

עודכן דף :
תאריך יצירת דף :

סביבת אימות

חלונות
  • חלונות 11
עורך Unity
  • 2021.3.3F1
חבילת מערכת קלט
  • 1.3.0

תנאים מוקדמים לטיפ זה

ההגדרות הבאות נקבעו מראש כהנחת יסוד לתיאור עצה זו.

על החומר הכלול במדגם

אפקטים קוליים מושאלים מהאתרים הבאים.

אודות קבצי שמע

ניתן להפעיל את פורמטי קבצי השמע הבאים עם התכונות הסטנדרטיות של Unity: אנא הכינו אותו מראש מכיוון שהוא ישמש בטיפים אלה.

  • WAV (.wav)
  • OggVorbis (.ogg)
  • שכבת MPEG 3 (.mp3)

לקבלת מידע נוסף, עיין בתיעוד הרשמי של Unity.

אודות הגבול העליון ועוצמת הקול של הפעלת שמע מרובים בו-זמנית

בטיפים הקודמים, AudioClip כעת ניתן להשמיע קולות מרובים על ידי השמעתם תוך כדי הכנת AudioSource.PlayOneShot נתוני שמע ב- . עם זאת, אין הגבלה על מספר המשחקים שניתן לשחק, כך שאם לא תגביל אותו במהלך המשחק, ניתן יהיה להשמיע צליל רב ולהפעיל עוצמת קול חזקה.

כאן אני רוצה ליצור תוכנית משלי ולשלוט במספר אפקטים קוליים שניתן לשחק בו זמנית.

יצירת הדוגמה

הפעם, אפקט הצליל יושמע בכל פעם שתלחץ על הלחצן, לכן צור את ממשק המשתמש כפי שמוצג באיור. הפרטים מתאימים וטובים.

שחרר והוסף את קובץ השמע שברצונך להשמיע לפרויקט שלך.

עד הפעם האחרונה, הפונקציה AudioSource הסטנדרטית של נוספה להיררכיה, הפעם, נוסיף תסריט כי נשים את השליטה שלנו. SoundPlayManager השאר את השם כ- .

צור את קובץ ה- Script באופן הבא:

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.

לאחר מכן, צור סקריפט עבור הלחצן.

צור את קובץ ה- Script באופן הבא:

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 שאליו אתה מצבר. מכיוון שאנו מתחברים למערכת האירועים, נגדיר את מערכת האירועים.

לבסוף, הקצה לאירוע OnClick לחץ על הלחצן.

הפעל את המשחק כשתסיים. כברירת מחדל, המספר המרבי של השמעות בו-זמנית מוגדר ל-2, לכן לחץ שוב על הכפתור בזמן ששני צלילים מתנגנים וודא שהצליל הראשון נעלם.

לתוכנית שנוצרה הפעם יש גבול עליון למספר זמני ההשמעה עבור כל סוג של צליל, כך שזה נשמע טבעי גם אם אתה שוזר אפקטים קוליים אחרים. עם זאת, בהתאם לסוג הצליל, הגבול העליון של 2 עשוי שלא להספיק, ולכן זה עשוי להיות רעיון טוב להיות מסוגל להגדיר גבול עליון עבור כל סוג של צליל. ובכן, אני לא יודע אם יש הזדמנות כזו לשכב את הצליל, אבל...