Unity——延迟、协程

延迟函数

        Destroy(object , float time):time时间之后销毁object类型

Destroy(this.gameObject, 3.5f);

        Invoke:延迟函数,通过方法名延迟调用对应函数

                注意:当此脚本或者当前脚本所在的游戏物体失活,延迟函数依然会执行;

                           但是当前脚本或者游戏物体被销毁,延迟函数就不会执行

void Update()
    {
        Invoke("AliveInvoke", 5.2f);

        if (Input.GetKeyDown(KeyCode.A))
        {
            transform.gameObject.SetActive(false);
        }

        if (Input.GetKeyDown(KeyCode.B))
        {
            Destroy(gameObject);
        }

        if (Input.GetKeyDown(KeyCode.C))
        {
            Destroy(this);
        }
    }

    void AliveInvoke()
    {
        transform.gameObject.SetActive(true);
        Debug.Log("Alive");
    }

        CancelInvoke():取消延迟函数

                如果不传参数,那么就会取消当前代码内的所有延迟函数

                如果传参数,就是取消对应函数延迟调用

        

        InvokeRepeating(string methodName, float time, float repeatRate)

                延迟重复调用,Time时间之后调用methodName方法,每隔repeatRate秒之后再调用一次methodName方法

 InvokeRepeating("TimeInvoke", 3, 2);

Unity——延迟、协程_第1张图片

 异步加载 

        不会引起代码阻塞

协程

        协程不是多线程,是假的“多线程”

        应用场景1.www加载网络数据;2.异步加载资源,场景

1.协程声明函数

     public IEnumerator PrintA()
    {
        //yield是IEnumerator的返回值
        //new WaitForSeconds(3.0f);代表等待3s,然后继续从此开始
        yield return new WaitForSeconds(3.0f);
        Debug.Log("printA.ing");
        //协程里面嵌套一个协程
        StartCoroutine("PrintB");
    }

    public IEnumerator PrintB()
    {
        yield return new WaitForSeconds(2.0f);
        Debug.Log("printB.ing");
    }

2.启动协程函数

        1.StartCoroutine("PrintA");

        2.StartCoroutine(PrintA()); (这个方法开启的协程只能通过Stop AllCoroutines关闭)

        3.IEnumerator ie = PrintA();
           StartCoroutine(ie);

3.协程的关闭(关闭的形式要和启动的形式相对应)

        1.StopCoroutine("PrintB");

        2.StopCoroutine(ie);

        3.StopAllCoroutines();

 private IEnumerator ie;
    // Start is called before the first frame update
    void Start()
    {
        Debug.Log(1);
        //StartCoroutine(PrintA());
        ie = PrintA();
        StartCoroutine(ie);
        Debug.Log(2);
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            Debug.Log(1);
            StopCoroutine(ie);
        }
        if (Input.GetKeyDown(KeyCode.B))
        {
            Debug.Log(2);
            StopAllCoroutines();
        }
    }

    public IEnumerator PrintA()
    {
        //yield是IEnumerator的返回值
        //new WaitForSeconds(3.0f);代表等待3s,然后继续从此开始
        yield return new WaitForSeconds(3.0f);
        Debug.Log("printA.ing");
        //协程里面嵌套一个协程
        StartCoroutine("PrintB");
        StopCoroutine("PrintB");
    }

    public IEnumerator PrintB()
    {
        yield return new WaitForSeconds(2.0f);
        Debug.Log("printB.ing");
    }

Unity——延迟、协程_第2张图片

 4.协程是否失效:

        当协程开启后,当前代码组件失活,不影响协程继续执行

        当协程开启后,当前代码组件销毁,协程就不继续执行

        当协程开启后,当前代码组件在游戏物体失活,协程不继续执行

        所以以后协程的代码不能挂在经常失活或者激活的游戏物体上

协程返回值

//new WaitForSeconds(3.0f);代表等待3s,然后继续从此开始
yield return new WaitForSeconds(3.0f);
//运行到当前帧最后执行
yield return new WaitForEndOfFrame();
//等待设置的fixtime的时间0.02
yield return new WaitForFixedUpdate();
//等一帧
yield return null;
//直接跳出协程

协程加载Resource资源

     ResourceRequest rr = null;
    IEnumerator ResourcesLoad(string path)
    {
        rr = Resources.LoadAsync(path);

        yield return rr;
    }

Unity的特殊文件夹

        Resource:资源文件夹,可以通过路劲直接用API Resources 进行加载;工程文件打包时,不在特殊文件夹内时,跟其他文件都没有依赖关系时,此资源不会打进包;但是Resources文件内所有资源,无论是否跟其他资源有关系,都会打进包;为了减小包体大小,Resources不能乱放资源

        Standard Assets:默认文件夹,此文件内资源会被优先编译,代码

        Plugins:插件一般放这个文件夹;还有一些android和ios平台区分的文件

        Editor:存放Unity工具类,这个文件夹内所有资源都不会打进包

        Application.persistentDataPath:固定数据路劲

你可能感兴趣的:(unity,c#,unity)