Kiểm soát số lượng hiệu ứng âm thanh được phát đồng thời

Trang Cập Nhật :
Ngày tạo trang :

Môi trường xác minh

Windows
  • cửa sổ 11
Biên tập viên Unity
  • 2021.3.3F1
Gói hệ thống đầu vào
  • 1.3.0

Điều kiện tiên quyết cho mẹo này

Các cài đặt sau đây đã được thực hiện trước làm tiền đề cho mô tả về mẹo này.

Về vật liệu đi kèm với mẫu

Hiệu ứng âm thanh được mượn từ các trang web sau.

Giới thiệu về tệp âm thanh

Các định dạng tệp âm thanh sau có thể được phát bằng các tính năng tiêu chuẩn của Unity: Vui lòng chuẩn bị trước vì nó sẽ được sử dụng trong những lời khuyên này.

  • WAV (.wav)
  • OggVorbis (.ogg)
  • MPEG lớp 3 (.mp3)

Để biết thêm thông tin, hãy xem tài liệu chính thức của Unity.

Giới thiệu về giới hạn trên và âm lượng của nhiều lần phát lại âm thanh đồng thời

Trong các mẹo trước, AudioClip giờ đây có thể phát nhiều giọng nói bằng cách phát chúng trong khi chuẩn bị AudioSource.PlayOneShot dữ liệu âm thanh trong . Tuy nhiên, không có giới hạn về số lượng trò chơi có thể chơi, vì vậy nếu bạn không giới hạn nó trong trò chơi, rất nhiều âm thanh có thể được phát và âm lượng lớn có thể được phát.

Ở đây tôi muốn tạo chương trình của riêng mình và kiểm soát số lượng hiệu ứng âm thanh có thể phát cùng một lúc.

Tạo mẫu

Lần này, hiệu ứng âm thanh sẽ phát mỗi khi bạn nhấp vào nút, vì vậy hãy tạo giao diện người dùng như trong hình. Các chi tiết là phù hợp và tốt.

Thả và thêm tệp âm thanh bạn muốn phát vào dự án của mình.

Cho đến lần trước, chức năng AudioSource tiêu chuẩn của đã được thêm vào hệ thống phân cấp, Lần này, chúng tôi sẽ thêm một kịch bản vì chúng tôi sẽ đặt quyền kiểm soát của riêng mình. SoundPlayManager Để tên là .

Tạo tập lệnh như sau:

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();
  }
}

Vì tập lệnh dài, giải thích chi tiết bị bỏ qua, nhưng nó có các chức năng sau.

  • AudioClip Bạn có thể phát âm thanh bằng cách vượt qua
  • Khi cùng một loại âm thanh được phát chồng lên nhau, nếu bạn cố gắng phát nhiều hơn một số giọng nói nhất định, dữ liệu phát lại cũ sẽ dừng lại (giá trị ban đầu tối đa là 2 lần phát lại).
  • Không được phép phát lại chồng chéo ở cùng một khung hình

Điều này ngăn âm lượng tăng lên khi cùng một âm thanh được phát liên tục. Về chức năng, chỉ bao gồm tối thiểu, vì vậy vui lòng thêm nó nếu bạn cần.

Tập lệnh được đính kèm với EventSystem.

Tiếp theo, tạo một tập lệnh cho nút.

Tạo tập lệnh như sau:

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);
  }
}

Quá trình phát lại được thực hiện bởi chính người tự tạo SoundPlayManager , vì vậy trong sự kiện nút, chỉ cần truyền dữ liệu âm thanh và phát nó.

Tập lệnh được đính kèm với EventSystem. Quản lý đính kèm không phải là chủ đề chính của Mẹo này, vì vậy nó phù hợp.

Đối với clip âm thanh, hãy đặt tệp âm thanh sẽ phát. Đặt Trình quản lý Phát âm thanh thành SoundPlayManager đối tượng mà bạn đang đính kèm. Vì chúng ta đang gắn vào EventSystem, chúng ta sẽ thiết lập EventSystem.

Cuối cùng, gán cho OnClick nút nhấp vào sự kiện.

Chạy trò chơi khi bạn hoàn tất. Theo mặc định, số lần phát đồng thời tối đa được đặt thành 2, vì vậy vui lòng nhấp lại vào nút trong khi hai âm thanh đang phát và đảm bảo rằng âm thanh đầu tiên biến mất.

Chương trình được tạo lần này có giới hạn trên về số lần phát lại cho từng loại âm thanh, vì vậy nghe có vẻ tự nhiên ngay cả khi bạn đan xen các hiệu ứng âm thanh khác. Tuy nhiên, tùy thuộc vào loại âm thanh, giới hạn trên của 2 có thể không đủ, vì vậy có thể là một ý tưởng tốt để có thể đặt giới hạn trên cho từng loại âm thanh. Chà, tôi không biết liệu có cơ hội như vậy để xếp lớp âm thanh hay không, nhưng ...