内嵌协程的2种方式

224 阅读1分钟

第一种方式

调用方式 :yield return fader.FadeIn(fadeInTime); 代码体:

using UnityEngine;
using System.Collections;
namespace RPG.SceneManagement
{
    //用于实现场景切换时的渐变效果
    //作为PersistentObject的子对象,存在于整个游戏的生命周期,等待被使用
    public class Fader : MonoBehaviour
    {
        
        CanvasGroup canvasGroup;
        Coroutine currentActiveFade;
        private void Awake()
        {
            canvasGroup = GetComponent<CanvasGroup>();
            //StartCoroutine(FadeOutIn());
        }
        public void FadeOutimmediate()
        {
            canvasGroup.alpha = 1;
        }
        //Test Nest Coroutine:
        //IEnumerator FadeOutIn()
        //{
        //    yield return FadeOut(3f);
        //    print("Faded out");
        //    yield return FadeIn(2f);
        //    print("Fade in");
        //}
        public IEnumerator FadeOut(float time)
        {
            return Fade(1,time);
        }

        public IEnumerator FadeIn(float time)
        {
            return Fade(0,time);
        }

        public IEnumerator Fade(float target,float time)
        {
            //1,Cancel running coroutine
            if (currentActiveFade != null)
            {
                StopCoroutine(currentActiveFade);
            }

            //2,Run fade out coroutine
            currentActiveFade = StartCoroutine(FadeRoutine(target, time));
            yield return currentActiveFade;
        }

        private IEnumerator FadeRoutine(float target, float time)
        {
            while (!Mathf.Approximately(canvasGroup.alpha, target))
            {
                canvasGroup.alpha = Mathf.MoveTowards(canvasGroup.alpha, target, Time.deltaTime / time);
                yield return null;
            }
        }
    }
}

fader.FaderIn()函数首先将返回Fade函数代码块(作为一个枚举器(IEnumerator)对象),然后yield return IEnumerator 作为一个协程将执行,这个协程的内部在执行完前面的代码之后,将开启一个新的协程FadeRoutine。

第二种方式

调用方式:fader.FadeIn(fadeInTime); 代码块:

using UnityEngine;
using System.Collections;
namespace RPG.SceneManagement
{
    //用于实现场景切换时的渐变效果
    //作为PersistentObject的子对象,存在于整个游戏的生命周期,等待被使用
    public class Fader : MonoBehaviour
    {
        CanvasGroup canvasGroup;
        Coroutine currentActiveFade;
        private void Awake()
        {
            canvasGroup = GetComponent<CanvasGroup>();
            //StartCoroutine(FadeOutIn());
        }
        public void FadeOutimmediate()
        {
            canvasGroup.alpha = 1;
        }
        //Test Nest Coroutine:
        //IEnumerator FadeOutIn()
        //{
        //    yield return FadeOut(3f);
        //    print("Faded out");
        //    yield return FadeIn(2f);
        //    print("Fade in");
        //}
        public Coroutine FadeOut(float time)
        {
            return Fade(1,time);
        }

        public Coroutine FadeIn(float time)
        {
            return Fade(0,time);
        }

        public Coroutine Fade(float target,float time)
        {
            //1,Cancel running coroutine
            if (currentActiveFade != null)
            {
                StopCoroutine(currentActiveFade);
            }

            //2,Run fade out coroutine
            currentActiveFade = StartCoroutine(FadeRoutine(target, time));
            return currentActiveFade;
        }

        private IEnumerator FadeRoutine(float target, float time)
        {
            while (!Mathf.Approximately(canvasGroup.alpha, target))
            {
                canvasGroup.alpha = Mathf.MoveTowards(canvasGroup.alpha, target, Time.deltaTime / time);
                yield return null;
            }
        }
    }
}

这种方式将保持协程在后台运行,不会