1.通过访问目标位置,调用音频文件
public class Sound : MonoBehaviour {
public AudioSource audiosource;
public static Sound _instance;
void Awake () {
audiosource = gameObject.AddComponent<AudioSource>();
audiosource.playOnAwake = false; //playOnAwake设为false时,通过调用play()方法启用
_instance = this; //通过Sound._instance.方法调用
}
//在指定位置播放音频 PlayClipAtPoint()
public void PlayAudioByName(string name)
{
//这里目标文件处在 Resources/Sounds/目标文件name
AudioClip clip = Resources.Load<AudioClip>("Sounds/"+name);
AudioSource.PlayClipAtPoint(clip, Camera.main.transform.position);
}
//如果当前有其他音频正在播放,停止当前音频,播放下一个
public void PlayMusicByName(string name)
{
AudioClip clip = Resources.Load<AudioClip>("Sounds/" + name);
if (audiosource.isPlaying)
{
audiosource.Stop();
}
audiosource.clip = clip;
audiosource.Play();
}
}
2.碰撞触发音效
public AudioClip AC;
public void OnCollisionEnter(Collision collision)
//或者OnTriggerEnter(Collider collider)
{
//被撞得物体原点发出声音(第二个参数用来设置发出声音的世界坐标,不要离AudioListener太远)
AudioSource.PlayClipAtPoint(AC, transform.localPosition);
}
3.Animation动作回调的音效
public class AnimationCallSound : MonoBehaviour
{
//防止同一个动作多次注册回调
public static List<string> isHaveevent = new List<string>();
//调用事件
public float EventTime;
//要播放的音效(必须绑定一个AudioSource组件)
public AudioSource AS;
void Start ()
{
if (AS == null)
Debug.LogError("没有绑定音效");
AddEvent();
//防止场景内动作相同的物体动作同步
Invoke("PlayAnim",Random.Range(0.1f,5.5f));
}
void PlayAnim()
{
animation.Play();
}
//给Animation动画注册回调事件
void AddEvent()
{
foreach (string name in isHaveevent)
{
if (animation.clip.name == name)
return;
}
AnimationEvent auidoEvent = new AnimationEvent();
auidoEvent.time = EventTime;
auidoEvent.functionName = "PlayAudio";
animation.clip.AddEvent(auidoEvent);
isHaveevent.Add(animation.clip.name);
Debug.Log("add " + animation.clip.name + " Event!");
}
public void PlayAudio()
{
AS.Play();
}
}