unity AudioSource播放完聲音后要執(zhí)行的函數(shù)或條件操作
將腳本掛在要判斷聲音是否播放完畢的物體上
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鍵執(zhí)行函數(shù)播放語音
if (Input.GetKeyDown(KeyCode.A))
{
PlayAudio(GameObject.GetComponent().clip)
}
}
//接受音頻文件和是否重復(fù)播放
public void PlayAudio(AudioClip clip, UnityAction callback = null, bool isLoop = false)
{
//獲取自身音頻文件進(jìn)行播放并且不重復(fù)播放
_audio.clip = clip;
_audio.loop = isLoop;
_audio.Play();
//執(zhí)行協(xié)成獲取音頻文件的時間
StartCoroutine(AudioPlayFinished(_audio.clip.length, callback));
}
//執(zhí)行協(xié)成函數(shù) 并且返回時間
private IEnumerator AudioPlayFinished(float time, UnityAction callback)
{
yield return new WaitForSeconds(time);
//聲音播放完畢后之下往下的代碼
# region 聲音播放完成后執(zhí)行的代碼
print("聲音播放完畢,繼續(xù)向下執(zhí)行");
#endregion
}
}
補(bǔ)充:Unity 的 AudioSourse 播完的監(jiān)聽
最近涉及到 音頻結(jié)束后的調(diào)用問題,unity 原生的音頻組件 AudioSourse 沒有功能,于是自己寫了一個。
下面是代碼:
using Assets.Scripts.Entities;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AudioSourceInfo
{
private float playTime = 0;
public AudioSource AudioSource { get; private set; }
public AudioState AudioState = AudioState.Idle;
public Action AfterPlaying { get; set; }
public int ID = 0;
public AudioSourceInfo(GameObject go)
{
this.AudioSource = go.AddComponent<AudioSource>();
}
public AudioClip Clip
{
get
{
return this.AudioSource.clip;
}
set
{
this.AudioSource.clip = value;
playTime = 0;
}
}
public bool Loop
{
get
{
return this.AudioSource.loop ;
}
set
{
this.AudioSource.loop = value;
}
}
public float Volume
{
get
{
return this.AudioSource.volume;
}
set
{
this.AudioSource.volume = value;
}
}
public void Play()
{
if (null == this.AudioSource)
{
return;
}
this.AudioState = AudioState.IsPlaying;
this.AudioSource.Play();
}
public void Pause()
{
if (null == this.AudioSource)
{
return;
}
if(this.AudioSource.isPlaying)
{
this.AudioState = AudioState.Pause;
this.AudioSource.Pause();
}
}
public void Stop()
{
if (null == this.AudioSource)
{
return;
}
this.AudioState = AudioState.Stop;
this.AudioSource.Stop();
if(AfterPlaying!= null)
{
this.AfterPlaying();
}
}
private void Update()
{
if (this.AudioSource != null && this.AudioSource.clip!= null && this.AudioState == AudioState.IsPlaying)
{
playTime += Time.fixedDeltaTime;
if (playTime >= this.Clip.length)
{
playTime = 0;
this.Stop();
}
}
}
}
public enum AudioState
{
Idle,
IsPlaying,
Pause,
Stop,
}
補(bǔ)充:Unity3d AudioSource如何監(jiān)聽播放完成并處理邏輯
想知道AudioSource什么時候播放完成并處理相關(guān)的邏輯,比如切換曲目,而unity又沒有提供相應(yīng)的事件
于是想到下面幾種方案:
1、Update時時判斷isPlaying
2、獲取音頻的播放長度,Invoke一下
后來查看api的時候突然想到,可以用協(xié)程啊。原理和Invoke一樣,這應(yīng)該是最好的方案了。

不過如果音頻暫停掉了之后而又沒有更新協(xié)程函數(shù)的話,問題就出現(xiàn)了。所以暫停的時候記得更新協(xié)程函數(shù)。
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
- Unity3D實(shí)現(xiàn)播放gif圖功能
- Unity 如何獲取鼠標(biāo)停留位置下的物體
- Unity之繞軸進(jìn)行旋轉(zhuǎn)的操作
- 解決unity rotate旋轉(zhuǎn)物體 限制物體旋轉(zhuǎn)角度的大坑
- unity 實(shí)現(xiàn)攝像機(jī)繞某點(diǎn)旋轉(zhuǎn)一周
- Unity3d 使用Gizmos畫一個圓圈
- unity 如何使用LineRenderer 動態(tài)劃線
- Unity 通過LineRenderer繪制兩點(diǎn)之間的直線操作
- Unity 實(shí)現(xiàn)給物體替換材質(zhì)球
- Unity解析gif動態(tài)圖操作
相關(guān)文章
C#使用BitConverter與BitArray類進(jìn)行預(yù)定義基礎(chǔ)類型轉(zhuǎn)換
這篇文章介紹了C#使用BitConverter與BitArray類進(jìn)行預(yù)定義基礎(chǔ)類型轉(zhuǎn)換的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-05-05
C#結(jié)合OpenCVSharp4使用直方圖算法實(shí)現(xiàn)圖片相似度比較
這篇文章主要為大家詳細(xì)介紹了C#如何結(jié)合OpenCVSharp4使用直方圖算法實(shí)現(xiàn)圖片相似度比較,文中的示例代碼簡潔易懂,需要的小伙伴可以參考下2023-09-09
Unity3D實(shí)現(xiàn)相機(jī)跟隨控制
這篇文章主要為大家詳細(xì)介紹了Unity3D實(shí)現(xiàn)相機(jī)跟隨控制,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-07-07
C#使用Directoryinfo類獲得目錄信息和屬性的方法
這篇文章主要介紹了C#使用Directoryinfo類獲得目錄信息和屬性的方法,涉及C#操作目錄的技巧,非常具有實(shí)用價值,需要的朋友可以參考下2015-04-04
C#實(shí)現(xiàn)輸入10個數(shù)存入到數(shù)組中并求max和min及平均數(shù)的方法示例
這篇文章主要介紹了C#實(shí)現(xiàn)輸入10個數(shù)存入到數(shù)組中并求max和min及平均數(shù)的方法,涉及C#簡單數(shù)據(jù)轉(zhuǎn)換與數(shù)值運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2017-07-07
C#操作Byte數(shù)組和十六進(jìn)制進(jìn)行互轉(zhuǎn)
這篇文章介紹了C#操作Byte數(shù)組和十六進(jìn)制進(jìn)行互轉(zhuǎn)的的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-05-05
Unity3D實(shí)現(xiàn)分頁系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Unity3D實(shí)現(xiàn)分頁系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-04-04

