第一个脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AudioManager : MonoBehaviour
{
public static AudioManager Instance;
private void Awake()
{
Instance = this;
}
SourceManager sourceManager;
ClipManager clipManager;
void Start()
{
sourceManager = new SourceManager(gameObject);
clipManager = new ClipManager();
}
/// <summary>
/// 播放音效
/// </summary>
/// <param name="clipName"></param>
public void PlayClip(string clipName)
{
AudioSource tempAudioSource = sourceManager.GetFreeAudio();
SingleClip tempSingleClip = clipManager.FindClipByName(clipName);
if (tempSingleClip!=null)
{
tempSingleClip.Play(tempAudioSource);
}
}
/// <summary>
/// 停止播放音效
/// </summary>
/// <param name="audioName"></param>
public void StopClip(string audioName)
{
sourceManager.Stop(audioName);
}
}
/// <summary>
/// 控制静音
/// </summary>
/// <param name="value"></param>
public void MuteControl(bool value)
{
sourceManager.MuteControl(value);
}
第二个脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SourceManager
{
GameObject owner;
List<AudioSource> allSources;
public SourceManager(GameObject tempOwner)
{
this.owner = tempOwner;
Init();
}
/// <summary>
/// 初始化
/// </summary>
public void Init()
{
allSources = new List<AudioSource>();
for (int i = 0; i < 3; i++)
{
AudioSource tempAS = owner.AddComponent<AudioSource>();
allSources.Add(tempAS);
}
}
/// <summary>
/// 静音
/// </summary>
/// <returns></returns>
public void MuteControl(bool value)
{
for (int i = 0; i < allSources.Count; i++)
{
allSources[i].mute = value;
}
}
/// <summary>
/// 停止播放
/// </summary>
/// <param name="audioName"></param>
public void Stop(string audioName)
{
for (int i = 0; i < allSources.Count; i++)
{
if ( allSources[i].isPlaying&&allSources[i].clip.name.Equals(audioName))
{
allSources[i].Stop();
}
}
ReleaseFreeAudio();
}
/// <summary>
/// 获取空的audiosource
/// </summary>
/// <returns></returns>
public AudioSource GetFreeAudio()
{
for (int i = 0; i < allSources.Count; i++)
{
if (!allSources[i].isPlaying)
{
return allSources[i];
}
}
AudioSource tempAS = owner.AddComponent<AudioSource>();
allSources.Add(tempAS);
return tempAS;
}
/// <summary>
/// 释放多余的Audiosource
/// </summary>
public void ReleaseFreeAudio()
{
int temCount=0;
List<AudioSource> tempSources = new List<AudioSource>();
for (int i = 0; i < allSources.Count; i++)
{
if (!allSources[i].isPlaying)
{
temCount++;
if (temCount > 3)
{
tempSources.Add(allSources[i]);
}
}
}
for (int i = 0; i < tempSources.Count; i++)
{
allSources.Remove(tempSources[i]);
GameObject.Destroy(tempSources[i]);
}
tempSources.Clear();
tempSources = null;
}
}
第三个脚本
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.UI;
public class ClipManager
{
public ClipManager()
{
ReadConfig();
LoadClip();
}
/// <summary>
/// 音效名字数组
/// </summary>
string[] clipNameArr;
/// <summary>
///音效数组
/// </summary>
SingleClip[] allSingleClipsArr;
/// <summary>
/// 读取配置文件
/// </summary>
public void ReadConfig()
{
var fileAddress = System.IO.Path.Combine(Application.streamingAssetsPath, "AudioConfig.txt");
FileInfo fInfo0 = new FileInfo(fileAddress);
if (fInfo0.Exists)
{
StreamReader r = new StreamReader(fileAddress);
string tempLine = r.ReadLine();
int IntCount = 0;
if (int.TryParse(tempLine, out IntCount))
{
clipNameArr = new string[IntCount];
for (int i = 0; i < IntCount; i++)
{
tempLine = r.ReadLine();
clipNameArr[i] = tempLine;
}
}
r.Close();
}
}
/// <summary>
/// 加载音效
/// </summary>
public void LoadClip()
{
allSingleClipsArr = new SingleClip[clipNameArr.Length];
for (int i = 0; i < clipNameArr.Length; i++)
{
AudioClip tempAudioClip = Resources.Load<AudioClip>(clipNameArr[i]);
SingleClip singleClip = new SingleClip(tempAudioClip);
allSingleClipsArr[i] = singleClip;
}
}
/// <summary>
/// 根据名字找clip
/// </summary>
/// <returns></returns>
public SingleClip FindClipByName(string clipName)
{
int tempIndex = -1;
for (int i = 0; i <clipNameArr. Length; i++)
{
if (clipNameArr[i].Equals(clipName))
{
tempIndex = i;
}
}
if (tempIndex!=-1)
{
return allSingleClipsArr[tempIndex];
}
else
{
return null;
}
}
}
第四个脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SingleClip {
AudioClip myAudioClip;
public SingleClip(AudioClip audioClip)
{
myAudioClip = audioClip;
}
public void Play(AudioSource audioSource)
{
audioSource.clip = myAudioClip;
audioSource.Play();
}
}
使用封装
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class UseAudio : MonoBehaviour {
void Update () {
if (Input.GetKeyDown(KeyCode.A))
{
AudioManager.Instance.PlayClip("game_music");
}
if (Input.GetKeyDown(KeyCode.B))
{
AudioManager.Instance.StopClip("game_music");
}
}
}
注意:TXT读取clip的name,第一行为clip数量,clip资源放resources文件夹,TXT放streamingAssets文件夹