Unity 协程回调

 按照顺序Debug,1-5进行 

//按照1-5顺序
//----------------------------------------------------
StartCoroutine(funcIEnumerator(ddd(), eee));
//----------------------------------------------------


#region 协程回调事件 例子1-5 仅做参考
    public IEnumerator ddd()
    {
        print("3333");
        yield return new WaitForSeconds(5);
        print("4444");
    }

    public Coroutine funcCoroutine(IEnumerator func)
    {

        print("2222");
        return StartCoroutine(func);
    }

    //第一个参数是先做的事,第二个参数进行后做的事,放到Action中
    public IEnumerator funcIEnumerator(IEnumerator func, Action callback)
    {
        print("1111");
        yield return funcCoroutine(func);
        callback();
    }

    Action eee = () =>
    {
        //下一步要做的事情
        print("5555");
    };
    #endregion

例如 我想做一个音频字幕同步的画面,启动项目 同时按照顺序播放多段音频、字幕等

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;


[RequireComponent(typeof(AudioSource))]
public class TextWait : MonoBehaviour
{
    public List<AudioClip> AudioClips = new List<AudioClip>();

    public List<string> TextList = new List<string>();

    public List<float> WaitTime = new List<float>();

    private Text Texts;

    private AudioSource audioSource;


    private void Start()
    {
        Texts = GameObject.Find("Canvas/Text").GetComponent<Text>();
        Texts.text = null;
        audioSource = this.GetComponent<AudioSource>();
        audioSource.clip = null;

        StartCoroutine(WaitTimeDelay());//播放字幕
        //StartCoroutine(WaitAudioDelay());//播放语音
        StartCoroutine(funcWaitAudioDelay(WaitAudioDelay(), AudioEndingEvent));
       
    }


    /// <summary>
    /// 播放字幕
    /// </summary>
    /// <returns></returns>
    IEnumerator WaitTimeDelay()
    {
        for (int i = 0; i < TextList.Count; i++)
        {
            Texts.text = TextList[i];
            yield return new WaitForSeconds(WaitTime[i]);
            Debug.Log(i + ".............." + WaitTime[i]);
        }
    }


    /// <summary>
    /// 播放语音
    /// </summary>
    /// <returns></returns>
    IEnumerator WaitAudioDelay()
    {
        for (int i = 0; i < AudioClips.Count; i++)
        {
            audioSource.clip = AudioClips[i];
            audioSource.Play();

            yield return new WaitForSeconds(AudioClips[i].length);
        }
    }

    public Coroutine CorWaitAudioDelay(IEnumerator func)
    {
        return StartCoroutine(func);
    }

    public IEnumerator funcWaitAudioDelay(IEnumerator func, Action callback)
    {
        yield return funcCoroutine(func);
    }
    
    Action AudioEndingEvent = () =>
     {
         //最后的触发的事件写在这里

     };
}

猜你喜欢

转载自blog.csdn.net/li1214661543/article/details/106468307