Unity实现类似Dotween链式结构扩展(Audio)...

转载自
http://www.manew.com/forum.php?mod=viewthread&tid=139396&extra=page%3D1%26filter%3Dtypeid%26typeid%3D497

驱动类
using UnityEngine;

/// <summary>
/// 音频事件驱动器
/// </summary>
public class AudioEventDriver : MonoBehaviour
{
    /// <summary>
    /// 委托定义
    /// </summary>
    /// <param name="Percentage">百分比</param>
    public delegate void OnUpdateEventHandler(float Percentage,float time);
    public delegate void OnCompleteEventHandler();
    /// <summary>
    ///  委托实例
    /// </summary>
    public AudioEventDriver.OnUpdateEventHandler onUpdate = null;
    public AudioEventDriver.OnCompleteEventHandler onComplete = null;
    private AudioSource audioSource = null;
    /// <summary>
    /// OnUpdate 驱动方法
    /// </summary>
    /// <param name="audioSource_"></param>
    /// <param name="onUpdateEventHandler"></param>
    public void OnUpdate(AudioSource audioSource_, AudioEventDriver.OnUpdateEventHandler onUpdateEventHandler)
    {
        onUpdate = onUpdateEventHandler;
        audioSource = audioSource_;
    }
    public void OnComplete(AudioSource audioSource_, AudioEventDriver.OnCompleteEventHandler onCompleteEventHandler)
    {
        audioSource = audioSource_;
        onComplete = onCompleteEventHandler;
    }
    private void Update()
    {
        //OnUpdate 驱动
        if (onUpdate != null && audioSource != null)
        {
            if (audioSource.isPlaying)
            {
                onUpdate(audioSource.time / audioSource.clip.length, audioSource.time);
            }
        }
        //OnComplete 驱动
        if (audioSource.time == audioSource.clip.length)
        {
            onComplete();
        }
    }
}
扩展类
using UnityEngine;

public static class AudioExtend
{
    /// <summary>
    /// 获得一个音频播放器
    /// </summary>
    /// <param name="gameObject"></param>
    /// <returns></returns>
    public static AudioSource GetAudio(this GameObject gameObject, bool add = false)
    {
        AudioSource audio = null;
        if (!add)
        {
            audio = gameObject.GetComponent<AudioSource>();
            if (audio == null)
            {
                audio = gameObject.AddComponent<AudioSource>();
            }
        }
        if (add)
        {
            audio = gameObject.AddComponent<AudioSource>();
        }
        return audio;
    }
    /// <summary>
    /// 设置Clip
    /// </summary>
    /// <param name="audioSource"></param>
    /// <returns></returns>
    public static AudioSource SetClip(this AudioSource audioSource, AudioClip clip)
    {
        if (clip)
        {
            audioSource.clip = clip;
        }
        return audioSource;
    }
    /// <summary>
    /// 获取音频事件驱动
    /// </summary>
    /// <param name="audioSource"></param>
    /// <returns></returns>
    private static AudioEventDriver GetEventDriver(this AudioSource audioSource)
    {
        AudioEventDriver AudioEventDriver = audioSource.gameObject.GetComponent<AudioEventDriver>();
        if (AudioEventDriver == null)
        {
            AudioEventDriver = audioSource.gameObject.AddComponent<AudioEventDriver>();
        }
        return AudioEventDriver;
    }
    /// <summary>
    /// 音频播放中回调
    /// </summary>
    /// <param name="audioSource"></param>
    /// <param name="onUpdateEventHandler"></param>
    /// <returns></returns>
    public static AudioSource OnUpdate(this AudioSource audioSource, AudioEventDriver.OnUpdateEventHandler onUpdateEventHandler)
    {
        GetEventDriver(audioSource).OnUpdate(audioSource, onUpdateEventHandler);
        return audioSource;
    }
    /// <summary>
    /// 音频播放完成回调
    /// </summary>
    /// <param name="audioSource"></param>
    /// <param name="onUpdateEventHandler"></param>
    /// <returns></returns>
    public static AudioSource OnComplete(this AudioSource audioSource, AudioEventDriver.OnCompleteEventHandler onCompleteEventHandler)
    {
        GetEventDriver(audioSource).OnComplete(audioSource, onCompleteEventHandler);
        return audioSource;
    }
}
测试类
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AudioTest : MonoBehaviour
{
    public AudioClip clip;
    void Start()
    {
        gameObject.GetAudio().SetClip(clip).OnUpdate(delegate(float precent, float time)
        {
            Debug.Log($"Time:{time} precent:{precent}");
        }).OnComplete(delegate { Debug.Log("完成");}).Play();
    }
    void Update()
    {
        
    }
}

猜你喜欢

转载自blog.csdn.net/yang854426171/article/details/88969657
今日推荐