بیک وقت چلنے والے صوتی اثرات کی تعداد کو کنٹرول کریں

جب صفحے کی تازہ کاری :
صفحہ تخلیق تاریخ :

تصدیق کا ماحول

Windows
  • ونڈوز 11
یونٹی ایڈیٹر
  • 2021.3.3f1
ان پٹ سسٹم پیکیج
  • 1.3.0

اس ٹوٹکے کے لئے ضروری شرائط

مندرجہ ذیل ترتیبات اس ٹپ کی وضاحت کے لئے بنیاد کے طور پر پیشگی بنائی گئی ہیں۔

نمونے کے ساتھ شامل مواد کے بارے میں

صوتی اثرات مندرجہ ذیل سائٹوں سے ادھار لئے جاتے ہیں۔

آڈیو فائلوں کے بارے میں

مندرجہ ذیل آڈیو فائل فارمیٹس کو یونٹی کی معیاری خصوصیات کے ساتھ چلایا جاسکتا ہے: براہ کرم اسے پیشگی تیار کریں کیونکہ یہ ان تجاویز میں استعمال کیا جائے گا.

  • ڈبلیو اے وی (.wav)
  • اوگ وربس (.ogg)
  • ایم پی ای جی پرت 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 جس سے آپ منسلک ہیں۔ چونکہ ہم ایونٹ سسٹم سے منسلک ہو رہے ہیں ، لہذا ہم ایونٹ سسٹم سیٹ کریں گے۔

آخر میں ، بٹن کلک ایونٹ کو OnClick تفویض کریں۔

جب آپ کام مکمل کر لیں تو کھیل چلائیں۔ پہلے سے طے شدہ طور پر ، بیک وقت ڈراموں کی زیادہ سے زیادہ تعداد 2 پر سیٹ کی گئی ہے ، لہذا جب دو آوازیں چل رہی ہوں تو براہ کرم دوبارہ بٹن پر کلک کریں اور اس بات کو یقینی بنائیں کہ پہلی آواز غائب ہوجائے۔

اس بار بنائے گئے پروگرام میں ہر قسم کی آواز کے لئے پلے بیک اوقات کی تعداد پر ایک اوپری حد ہے ، لہذا اگر آپ دوسرے صوتی اثرات کو آپس میں جوڑتے ہیں تو بھی یہ قدرتی لگتا ہے۔ تاہم ، آواز کی قسم پر منحصر ہے ، 2 کی اوپری حد کافی نہیں ہوسکتی ہے ، لہذا ہر قسم کی آواز کے لئے اوپری حد مقرر کرنے کے قابل ہونا ایک اچھا خیال ہوسکتا ہے۔ ٹھیک ہے، مجھے نہیں معلوم کہ آواز کو پرت کرنے کا ایسا موقع ہے یا نہیں، لیکن ...