异步函数: Invoke
被调用的方法不是立刻执行,而是过一段时间后才执行
注:Invoke是不能接受有参数的方法的
Invoke是受Time.timeScale的影响,所以当Time.timeScale=0 的时候,Invoke是无效的。因为它根本调用不到,无论挂载Invoke脚本的物体或者组件状态是否为激活状态,也无法停止Invoke,除非它的gameObject被销毁(Destory)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class InvokeDemo : MonoBehaviour
{
void Start()
{
//游戏运行2s后调用一次Show方法
Invoke("Show", 2f);
//游戏运行3s后调用第一次,以后每隔2s调用一次
InvokeRepeating("Show", 3f, 2f);
//此时打印true 检测此MonoBehaviour是否有调用在等候
Debug.Log(IsInvoking("Show"));
//停止此脚本上的Invoke,没有参数就是清除所有的Invoke,有参数清除指定参数
//执行后上面两种方法都会停止。
CancelInvoke("Show");
//此时为false,表示上面的停止方法起作用了
Debug.Log(IsInvoking("Show"));
}
void Show()
{
//创建了一个标准立方体
GameObject.CreatePrimitive(PrimitiveType.Cube);
}
}
协程:Coroutine
所需要的函数类型需要一个返回的迭代器(IEnumerator)需要函数中有挂起yield return
一个协同程序在执行过程中,可以在任意位置使用yield return的返回值控制何时恢复协同向下执行
yield 是一种特殊类型的return(返回)语句,他可以确保函数下一次被执行时,不是从头开始,而是从yield 语句处开始。
public class Coroutine : MonoBehaviour
{
void Start()
{
StartCoroutine("Show"); //使用字符串方式,开启协程
StartCoroutine("Show", 5); //第二个参数是Show()方法的参数 最多可传一个参数
StartCoroutine(Show()); //使用IEnumerator类型参数 进行协程调用
StartCoroutine(Show(10, 2)); //此方法可以传无限参数
}
void Update()
{
StartCoroutine("Show");
StopCoroutine("Show"); //遇到yield return就不再执行 只能停止字符串传参得函数
StopCoroutine("Show"); //遇到yield return就不再执行
StopCoroutine(Show()); //目前测试此方法无效
StopAllCoroutines(); //此方法可以停止两种协程
}
IEnumerator Show()
{
print("befor");
yield return new WaitForSeconds(2f); //2s后继续执行协程
print("after");
yield return new WaitForSeconds(1f); //1s后继续执行协程
print("final");
}
IEnumerator Show(int i)
{
print("befor " + i);
yield return null;
}
IEnumerator Show(int i, int j)
{
print(j + i);
yield return null;
}
}