一、首先把准备好的资源放到了 Resouces的Audios文件夹下,方便动态加载。

二、之后,在场景中建了一个空物体当做管理音乐的控制器,将背景音乐和音效统一管理起来

这里一定是两个AudioSource,一个用来播放背景音乐,一个用来播放音效,通常背景音乐用一个就可以了,音效是一直要变换的
代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 挂载:脚本挂载到了空物体上面
/// 思路:
/// 先加载本地的音频文件放到数组里面
/// 然后将数组里面的元素存放到字典里面
/// 播放哪个音频的时候再通过元素的名字查找相对应的音频文件
/// </summary>
public class SoundManager : MonoBehaviour
{
//------------------------------//
/// <summary>
/// 单例模式
/// </summary>
public static SoundManager instance = new SoundManager();
private SoundManager()
{
}
/// <summary>
/// 将声音放入字典中,方便管理
/// </summary>
private Dictionary<string, AudioClip> _soundDictionary;
//AudioSource组件
private AudioSource[] audioSources;
//声音数组
AudioClip[] audioArray;
private AudioSource bgAudioSource;
private AudioSource audioSourceEffect;
void Awake()
{
instance = this;
_soundDictionary = new Dictionary<string, AudioClip>();
//本地加载
audioArray = Resources.LoadAll<AudioClip>("Audios");
audioSources = GetComponents<AudioSource>();
bgAudioSource = audioSources[0];
audioSourceEffect = audioSources[1];
//存放到字典
foreach (AudioClip item in audioArray)
{
_soundDictionary.Add(item.name, item);
}
}
//播放背景音乐
public void PlayBGaudio(string audioName)
{
if (_soundDictionary.ContainsKey(audioName))
{
bgAudioSource.clip = _soundDictionary[audioName];
bgAudioSource.Play();
}
}
//播放音效
public void PlayAudioEffect(string audioEffectName)
{
if (_soundDictionary.ContainsKey(audioEffectName))
{
audioSourceEffect.clip = _soundDictionary[audioEffectName];
audioSourceEffect.Play();
}
}
}
音效是一直在场景中不消失的,所以要保证切换场景的时候资源不会删除。
//=============================================//
static bool isHaveAudio=false ;
public GameObject tempGameObject;
//=============================================//
//不销毁音效
void Start()
{
if (!isHaveAudio)
{
tempGameObject=Instantiate(Resources.Load("SoundManage"))as GameObject;
isHaveAudio=true ;
}
DontDestroyOnLoad (tempGameObject);
}
使用:先执行加载预设(Start())脚本。
SoundManage是个预设,预设绑定SoundManager.cs脚本。
网友评论