第一种方式
调用方式 :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;
}
}
}
}
这种方式将保持协程在后台运行,不会