Unity中的协程

在unity中目前我知道的协程就是用来让程序中代码段等待指定的时间后再往后继续执行,比如在制做人物挥剑时,需要在人物挥剑到最远处时调用使碰撞器激活的语句,因此这个就需要在按下攻击键后等待一定的时间后再激活碰撞器,再比如说在制作场景过渡时,需要做淡入淡出的效果,这个时候需要等待场景的淡入和淡出动画执行完之后再执行场景的加载函数,总之想要代码运行后过几秒再执行就需要用到协程

协程的内部实现就不详细解释,直接告诉使用方法,以场景淡入淡出的过度动画为例:

首先先用Canvas为其添加一个全黑的图片

随后为其图片添加淡入和淡出动画(淡入时变黑,淡出是变白)

设置好淡入淡出动画的过渡条件(都可以用布尔值设置)

随后就是用脚本来控制组件,在unity中,像这种想要控制UI界面,包括场景的加载的可以使用一个空对象来挂载脚本,就像这样

注意这里的动画器,给它赋值时1.以将动画器本身拖给它;2.还可以将Image对象拖给它(因为Image对象中含有Image动画器)。

代码如下:

public GameObject eventObj;
public GameObject canvasObj;
public Animator animator;

public static SceneLoad instance { get; private set; }//这是单例模式

private void Awake()
{
instance = this;
}
private void Start()
{
GameObject.DontDestroyOnLoad(canvasObj);
GameObject.DontDestroyOnLoad(eventObj);
GameObject.DontDestroyOnLoad(this.gameObject);
}

public void SceneLoad1()
{
StartCoroutine(LoadLevel(1));
}
public void SceneLoad2()
{
StartCoroutine(LoadLevel(2));
}
public IEnumerator LoadLevel(int levelindex)
{
animator.SetBool("FadeIn", true);
animator.SetBool("FadeOut", false);
yield return new WaitForSeconds(1);
animator.SetBool("FadeIn", false);
animator.SetBool("FadeOut", true);
UnityEngine.SceneManagement.SceneManager.LoadScene(levelindex);
}

在其它脚本里面需要调用加载场景函数时,直接使用

SceneLoad.instance.SceneLoad1();//这里考虑下能不能使用静态函数

这里时不能的,因为这里通过instance单例对象调用的SceneLoad1()函数,虽然可以把SceneLoad1()函数改为静态函数,但是其中的协程函数却不能改为静态函数,因此这里可以发现在其它脚本中调用协程函数时,必须要用单例模式,用过对象来调用,不能用静态的方法调用

补充一点:除了可以使用协程进行延时调用以外,还可以使用Invoke函数,该函数需要两个参数,一个是延时调用的函数名,另一个是延时调用的时间,注意Invoke中传递的方法不能是含有参数的方法

猜你喜欢

转载自blog.csdn.net/qq_62947569/article/details/128505755