Unity 音效模块(一)

Unity3D 音效模块(一)


基本思路

  • 动态加载所有音效片段,并保存在一个字典里
  • 需要使用时,直接去字典拿,然后给播放器(AudioSource)播放
    Unity 音效模块(一)_第1张图片

实现

  • m_path 必须和资源库里定义的名字一样
using System.Collections.Generic;
using UnityEngine;

public class AudioManager : MonoBehaviour {
     
    //资源路径
    private readonly string m_path = "AudioAssets";
    //播放器
    private AudioSource m_audioSource;
    //音效片段
    private AudioClip[] m_audioClips = null;
    //通过 K V 存储片段 方便管理
    private Dictionary<string, AudioClip> audioDir;

    private static AudioManager instance;

    public static AudioManager Instance {
     
        get {
     
            if (instance == null) {
     
                GameObject go = new GameObject ("AudioManager");
                DontDestroyOnLoad (go);
                instance = go.AddComponent<AudioManager> ();
            }
            return instance;
        }
    }


    private void Awake () {
     
        m_audioSource = gameObject.AddComponent<AudioSource> ();
        audioDir = new Dictionary<string, AudioClip> ();
        //加载所有到音效
        m_audioClips = Resources.LoadAll<AudioClip> (m_path);
        for (int i = 0; i < m_audioClips.Length; i++) {
     
            //处理对应名字
            var str = m_audioClips[i].ToString ();
            str = str.Substring (0, str.Length - 24);
            audioDir.Add (str, m_audioClips[i]);
        }
    }

    /// 
    /// 播放一次音效
    /// 
    /// 音效名
    public void PlayAudio (string _audioName) {
     
        AudioClip clip = null;
        audioDir.TryGetValue (_audioName, out clip);
        m_audioSource.PlayOneShot (clip);
    }
}

测试

  • 首先在Assets文件夹创建Resources文件夹 (Resources作为unity保留文件夹存在,必须取这名)
  • 接着再Resources里创建AudioAssets文件夹(AudioAssets名字随意)
  • 然后随便拖几个unity支持的音频格式做测试 (音效名随意 如图)
    • .AIFF 适用于较短的音乐文件可用作游戏打斗音效
    • .WAV 适用于较短的音乐文件可用作游戏打斗音效
    • .MP3 适用于较长的音乐文件可用作游戏背景音乐
    • .OGG 适用于较长的音乐文件可用作游戏背景音乐

Unity 音效模块(一)_第2张图片

  • 编写测试脚本test,添加如下代码
    • 其中不建议使用GameObject.Find() 在unity中使用的是深度优先遍历,一旦游戏物体增多效率会比较低,这里只是为了方便测试
    • 播放具体音效时,只需写对应音效名即可
using UnityEngine;
using UnityEngine.UI;

public class test : MonoBehaviour {
     
    void Start () {
     
        GameObject.Find ("Button1").GetComponent<Button> ().onClick.AddListener (PlaySound1);
        GameObject.Find ("Button2").GetComponent<Button> ().onClick.AddListener (PlaySound2);
    }

    void PlaySound1 () {
     
        AudioManager.Instance.PlayAudio ("qwe");
    }
    
    void PlaySound2 () {
     
        AudioManager.Instance.PlayAudio ("asd");
    }
}
  • 创建两个按钮来测试 (按钮名和test里对应)
  • 把test脚本随便挂载到一个对象上
  • 运行后随便点击一个button按钮,不出意外会播放音效,并且会在Hierarchy面板创建一个音效管理器如图
    Unity 音效模块(一)_第3张图片

总结

  • 优点
    • 非常方便的管理了所有音效,动态加载
    • 添加其他音效时,也只需放在对应文件即可
  • 缺点
    • 只有一个播放器

最后

学习笔记,仅供参考,如有不正,欢迎指正

你可能感兴趣的:(Unity3D,unity3d,unity,游戏,游戏开发)