欢迎来到代码驿站!

.NET代码

当前位置:首页 > 软件编程 > .NET代码

unity AudioSource播放完声音后要执行的函数或条件操作

时间:2021-07-21 08:21:01|栏目:.NET代码|点击:

将脚本挂在要判断声音是否播放完毕的物体上

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 没有功能,于是自己写了一个。

下面是代码:

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,
}
 

补充:Unity3d AudioSource如何监听播放完成并处理逻辑

想知道AudioSource什么时候播放完成并处理相关的逻辑,比如切换曲目,而unity又没有提供相应的事件

于是想到下面几种方案:

1、Update时时判断isPlaying

2、获取音频的播放长度,Invoke一下

后来查看api的时候突然想到,可以用协程啊。原理和Invoke一样,这应该是最好的方案了。

不过如果音频暂停掉了之后而又没有更新协程函数的话,问题就出现了。所以暂停的时候记得更新协程函数。

上一篇:c#实现metro文件压缩解压示例

栏    目:.NET代码

下一篇:C#使用foreach语句遍历队列(Queue)的方法

本文标题:unity AudioSource播放完声音后要执行的函数或条件操作

本文地址:http://www.codeinn.net/misctech/159786.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有