التحكم في عدد المؤثرات الصوتية المتزامنة التي يتم تشغيلها

تحديث الصفحة :
تاريخ إنشاء الصفحة :

بيئة التحقق

نوافذ
  • ويندوز ١١
محرر الوحدة
  • 2021.3.3f1
حزمة نظام الإدخال
  • 1.3.0

المتطلبات الأساسية لهذه النصيحة

تم إجراء الإعدادات التالية مسبقا كمقدمة لوصف هذه النصيحة.

حول المواد المدرجة مع العينة

يتم استعارة المؤثرات الصوتية من المواقع التالية.

حول الملفات الصوتية

يمكن تشغيل تنسيقات الملفات الصوتية التالية باستخدام ميزات Unity القياسية: يرجى إعداده مسبقا لأنه سيتم استخدامه في هذه النصائح.

  • الرعايا (.wav)
  • أوغفوربيس (.ogg)
  • طبقة MPEG 3 (.mp3)

لمزيد من المعلومات، راجع وثائق الوحدة الرسمية.

حول الحد الأعلى وحجم تشغيل الصوت المتزامن المتعدد

في النصائح السابقة ، 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 تشغيل).
  • لا يسمح بالتشغيل المتداخل في نفس الإطار

هذا يمنع مستوى الصوت من الزيادة عند تشغيل نفس الصوت متتاليا. من حيث الوظيفة ، يتم تضمين الحد الأدنى فقط ، لذا يرجى إضافته إذا كنت في حاجة إليه.

البرنامج النصي مرفق بنظام الحدث.

بعد ذلك ، قم بإنشاء برنامج نصي للزر.

قم بإنشاء البرنامج النصي كما يلي:

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 نفسه العصامي ، لذلك في حدث الزر ، ما عليك سوى تمرير البيانات الصوتية وتشغيلها.

البرنامج النصي مرفق بنظام الحدث. إدارة الإرفاق ليست الموضوع الرئيسي لهذه النصائح ، لذلك فهي مناسبة.

بالنسبة لمقطع الصوت ، اضبط ملف الصوت المراد تشغيله. قم بتعيين "إدارة تشغيل الصوت" إلى SoundPlayManager الكائن الذي تقوم بتوصيله. نظرا لأننا نعلق على EventSystem ، فسنقوم بتعيين EventSystem.

أخيرا ، قم بتعيين حدث النقر فوق OnClick الزر.

قم بتشغيل اللعبة عند الانتهاء. بشكل افتراضي ، يتم تعيين الحد الأقصى لعدد عمليات التشغيل المتزامنة على 2 ، لذا يرجى النقر فوق الزر مرة أخرى أثناء تشغيل صوتين والتأكد من اختفاء الصوت الأول.

يحتوي البرنامج الذي تم إنشاؤه هذه المرة على حد أعلى لعدد أوقات التشغيل لكل نوع من أنواع الصوت ، لذلك يبدو طبيعيا حتى إذا قمت بدمج المؤثرات الصوتية الأخرى. ومع ذلك ، اعتمادا على نوع الصوت ، قد لا يكون الحد الأعلى 2 كافيا ، لذلك قد يكون من الجيد أن تكون قادرا على تعيين حد أعلى لكل نوع من أنواع الصوت. حسنا ، لا أعرف ما إذا كانت هناك مثل هذه الفرصة لطبقة الصوت ، ولكن ...