Unity 流程控制

异步函数: 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;
    }
}
  • Invoke 是在开启的时候给一个时间告诉几秒后调用,而coroutine是直接调用方法中去处理等待时间,Coroutine在处理上时间更灵活

  • Invoke将物体激活关闭们不会停止调用,Coroutine将物体激活关闭,将不能调用

  • Invoke不支持传参数 Coroutine支持

猜你喜欢

转载自blog.csdn.net/qq1084327456/article/details/128130554
今日推荐