Unity3d之协程自实现测试

using UnityEngine;
using System.Collections;

public class TestStartCoroutine : MonoBehaviour
{
    IEnumerator m_etor;
    bool m_moveNext;
    MyWaitForSeconds m_waiter;

    #region MyRegion

    class MyWaitForSeconds
    {
        int m_seconds;
        float m_timer;

        public MyWaitForSeconds(int seconds)
        {
            m_seconds = seconds;
            m_timer = 0;
        }

        public bool Update(float deltaTime)
        {
            m_timer += deltaTime;
            return m_timer >= m_seconds;
        }
    }

    #endregion

    void Start()
    {
        MyStartCoroutine(T1());
    }

    public void MyStartCoroutine(IEnumerator etor)
    {
        m_etor = etor;
        m_moveNext = true;
    }

    IEnumerator T1()
    {
        Debug.Log("#1");

        int i = 0;
        while (i++ < 60)
        {
            Debug.Log("#2  " + i);
            yield return null;
        }

        Debug.Log("#3");

        yield return new MyWaitForSeconds(3);

        Debug.Log("#4");
    }

    void Update()
    {
        if (m_moveNext)
        {
            if (!m_etor.MoveNext())
                m_moveNext = false;
            else if (m_etor.Current is MyWaitForSeconds)
            {
                m_waiter = (MyWaitForSeconds)m_etor.Current;
                m_moveNext = false;
            }
        }

        if (m_waiter != null)
        {
            if (m_waiter.Update(Time.deltaTime))
            {
                m_waiter = null;
                m_moveNext = true;
            }
        }
    }
}

  Unity3d的协程是利用枚举器来实现的,我猜可能是跟以上测试代码一样,在一帧里让枚举器的指针加1,从而可以等待1帧。

时间: 2024-10-12 15:21:20

Unity3d之协程自实现测试的相关文章

Unity3D之协程

Unity3D提供了一个工具叫做“协程”,所谓协程就是使用StartCoroutine()里面添加一个方法来调用该方法.对这个被调用的方法有如下规定:返回值必须是IEnumerator类型.那么为什么要使用协程呢?通常这是为了应付某一类需要,比如想要延时执行某一段代码,或者使用www进行一些请求和加载等阻塞操作. 协程与多线程没有关系.协程每一帧都执行,时间段位于LateUpdate之后.所以说它只不过是在主线程里面每帧执行的一个函数而已.协程使用的原理类似于foreach循环,都是使用迭代器来

unity3D中协程和线程混合

这是我google unity3D一个问题偶然发现的在stackflow上非常有趣的帖子: 大意是 要在unity3D上从server下载一个zip,并解压到持久化地址.并将其载入到内存中.以下展示了这样的使用方法: IEnumerator LongCoroutine() { yield return StartCoroutine(DownloadZip()); ExtractZip(); yield return StartCoroutine(LoadZipContent()); } 可是Ex

【Unity3D基础教程】(五):详解Unity3D中的协程(Coroutine)

[狗刨学习网] 为什么需要协程 在游戏中有许多过程(Process)需要花费多个逻辑帧去计算. 你会遇到"密集"的流程,比如说寻路,寻路计算量非常大,所以我们通常会把它分割到不同的逻辑帧去进行计算,以免影响游戏的帧率. 你会遇到"稀疏"的流程,比如说游戏中的触发器,这种触发器大多数时候什么也不做,但是一旦被调用会做非常重要的事情(比图说游戏中自动开启的门就是在门前放了一个Empty Object作为trigger,人到门前就会触发事件). 不管什么时候,如果你想创建

Unity3D 协程 Coroutine

协程(Coroutine)的概念存在于很多编程语言,例如Lua.ruby等.而由于Unity3D是单线程的,因此它同样实现了协程机制来实现一些类似于多线程的功能,但是要明确一点协程不是进程或线程,其执行过程更类似于子例程,或者说不带返回值的函数调用. 协程类型IEnumerator 在内部方法使用 yield return 语句,直观的说语句说在位置便是协程暂停,并且将控制权移交给Unity引擎以及之后继续执行余下逻辑的地方. 例如 IEnumerator Method(){ int i=0;

python协程--asyncio模块(基础并发测试)

在高并发的场景下,python提供了一个多线程的模块threading,但似乎这个模块并不近人如意,原因在于cpython本身的全局解析锁(GIL)问题,在一段时间片内实际上的执行是单线程的.同时还存在着资源争夺的问题.python3.4之后引入了基于生成器对象的协程概念.也就是asyncio模块.除了asyncio模块,python在高并发这一问题还提出了另外一些解决方案,例如tornado和gevent都实现了类似的功能.由此,在方案选择上提供了更多的可能性.以下是threading模块和a

Unity3D 协程 浅谈

协程 理解:协程不是线程,也不是异步执行(知道就行). 1.协程和MonoBehaviour的Update函数一样,也是在MainThread中执行的(一定得明白这句话意思). void Start () { StartCoroutine(HelloCoroutine()); } void Update () { Debug.Log("Update..."); } void LateUpdate() { Debug.Log("LateUpdate..."); } I

Unity3D协程介绍 以及 使用

作者ChevyRay ,2013年9月28日,snaker7译  原文地址:http://unitypatterns.com/introduction-to-coroutines/ 在Unity中,协程(Coroutines)的形式是我最喜欢的功能之一,几乎在所有的项目中,我都会使用它来控制运动,序列,以及对象的行为.在这个教程中,我将会说明协程是如何工作的,并且会附上一些例子来介绍它的用法. 协程介绍 Unity的协程系统是基于C#的一个简单而强大的接口 ,IEnumerator,它允许你为自

yield学习续:yield return迭代块在Unity3D中的应用——协程

必读好文推荐: Unity协程(Coroutine)原理深入剖析 Unity协程(Coroutine)原理深入剖析再续 上面的文章说得太透彻,所以这里就记一下自己的学习笔记了. 首先要说明的是,协程并不是线程,协程是运行在主线程中的,是和主线程同步执行的代码,不同的地方是运行的方法可以被yield return在当前帧进行打断,到下一帧后可以继续从被打断的地方继续运行. 下面我们看一个示例,场景中有一个空的GameObject对象,其绑定了下面的脚本: 1 using UnityEngine;

测试-Coroutine协程能否受时间缩放影响

yield return new WaitForSeconds(1f); print("!!!" + Time.realtimeSinceStartup); yield return null; 答案是会受到 那么怎么忽略时间缩放?找了下官方没提供,也是一头雾水. 不过我不用协程,我有集成良好的计时器