自制简单的3D音效播放脚本
使用如下
新建场景,
新建空对象,挂载测试脚本testEasyAudio_3D
public class TestEasyAudio_3D : MonoBehaviour
{
AudioListener audioListener;
GameObject leftAudio, rightAudio;
private void Awake()
{
audioListener = FindObjectOfType<AudioListener>();
if (audioListener)
{
print("find listener");
}
leftAudio = new GameObject();
leftAudio.transform.position = audioListener.transform.position + new Vector3(-15, 0, 0);
rightAudio = new GameObject();
leftAudio.transform.position = audioListener.transform.position + new Vector3(15, 0, 0);
}
private void Update()
{
if (Input .GetKeyDown (KeyCode.A))
{
EasyAudio_3D.PlayAudio_3D("testAudio", leftAudio);
}
if (Input.GetKeyDown(KeyCode.D))
{
EasyAudio_3D.PlayAudio_3D("testAudio", rightAudio);
}
}
}
上代码
/********************************************************
文件: AudioManager.cs
作者: 阿飞
日期: CreateTime
寄语: 虎年 虎虎生威 大吉大利
功能: Nothing
*********************************************************/
using System.Collections.Generic;
using UnityEngine;
public class EasyAudio_3D
{
/// <summary>
/// 能听到声音的最远距离
/// </summary>
private const float maxDistance = 30;
private static bool isDebug = true;
/// <summary>
/// 加载内存中的音频文件
/// </summary>
static Dictionary<string, AudioClip> audioClipDic = new Dictionary<string, AudioClip>();
/// <summary>
/// 不固定父物体的音频播放器
/// </summary>
static List<AudioSource> audioSources_3d = new List<AudioSource>();
public static void PlayAudio_3D(string audioName, Transform pos, bool follow = false)
{
//找到播放组件
AudioSource tmpAudio =GetFreeAudioSource();
//找到音频文件
AudioClip tmpClip;
if (audioClipDic.ContainsKey(audioName))
{
tmpClip = audioClipDic[audioName];
}
else
{
tmpClip = Resources.Load<AudioClip>(audioName);
//保存音效
audioClipDic.Add(audioName, tmpClip);
}
//设置音效位置
if (follow)
{
tmpAudio.gameObject.transform.parent = pos;
tmpAudio .transform.localPosition = Vector3.zero;
}
else
{
tmpAudio.gameObject.transform.position = pos.position;
}
//播放音效
tmpAudio.PlayOneShot(tmpClip);
if (isDebug)
{
Debug.Log(string.Format("音效播放完成\n总Audio数为:{0}", audioSources_3d.Count.ToString ()));
}
}
/// <summary>
/// 获得一个空闲的audioSource
/// </summary>
private static AudioSource GetFreeAudioSource()
{
foreach (var item in audioSources_3d)
{
if (! item .isPlaying )
{
return item;
}
}
return AddAudioSource_3D();
}
/// <summary>
/// 添加3D声音播放组件
/// </summary>
private static AudioSource AddAudioSource_3D()
{
GameObject audioObj = new GameObject();
audioObj.name = "easyAudio_3D";
audioObj.transform.localPosition = Vector3.zero;
AudioSource audioSource = audioObj.AddComponent<AudioSource>();
//设置audio参数
audioSource.spatialBlend = 1;//3D效果
//设置为3D效果
audioSource.maxDistance = maxDistance;
//线性衰减
audioSource.rolloffMode = AudioRolloffMode.Linear;
audioSources_3d.Add(audioSource);
return audioSource;
}
}