将脚本挂在要判断声音是否播放完毕的物体上
- using System.Collections;
- using UnityEngine;
- using UnityEngine.Events;
- [RequireComponent(typeof(AudioSource))]
- public class AudioManager : MonoBehaviour
- {
- public static AudioManager instence = null;
- private AudioSource _audio;
- void Awake()
- {
- if (instence == null)
- {
- instence = this;
- }
- }
- void Start()
- {
- _audio = GetComponent<AudioSource>();
-
- }
- void Update()
- {
- //按下键盘按钮A键执行函数播放语音
- if (Input.GetKeyDown(KeyCode.A))
- {
- PlayAudio(GameObject.GetComponent().clip)
- }
- }
- //接受音频文件和是否重复播放
- public void PlayAudio(AudioClip clip, UnityAction callback = null, bool isLoop = false)
- {
- //获取自身音频文件进行播放并且不重复播放
- _audio.clip = clip;
- _audio.loop = isLoop;
- _audio.Play();
- //执行协成获取音频文件的时间
- StartCoroutine(AudioPlayFinished(_audio.clip.length, callback));
- }
- //执行协成函数 并且返回时间
- private IEnumerator AudioPlayFinished(float time, UnityAction callback)
- {
- yield return new WaitForSeconds(time);
- //声音播放完毕后之下往下的代码
- # region 声音播放完成后执行的代码
- print("声音播放完毕,继续向下执行");
- #endregion
- }
- }
补充:Unity 的 AudioSourse 播完的监听
最近涉及到 音频结束后的调用问题,unity 原生的音频组件 AudioSourse 没有功能,于是自己写了一个。
下面是代码:
补充:Unity3d AudioSource如何监听播放完成并处理逻辑
想知道AudioSource什么时候播放完成并处理相关的逻辑,比如切换曲目,而unity又没有提供相应的事件
于是想到下面几种方案:
1、Update时时判断isPlaying
2、获取音频的播放长度,Invoke一下
后来查看api的时候突然想到,可以用协程啊。原理和Invoke一样,这应该是最好的方案了。

不过如果音频暂停掉了之后而又没有更新协程函数的话,问题就出现了。所以暂停的时候记得更新协程函数。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持w3xue。如有错误或未考虑完全的地方,望不吝赐教。