ActionScript3脚本引擎为了方便热更新逻辑开发,提供的从脚本继承Unity类库功能在一些情况下可以提供开发的便利。

这次来建立一个示例,演示一下如何在脚本中自定义协程中断指令

Unity中的协程

unity中协程经常被用到,从本质上来讲,当调用startCoroutine时,传入的参数是一个实现IEnumerator接口的对象。

IEnumerator接口是一个集合访问器,可以使用类似如下代码访问集合中的所有对象。

System.Collections.IEnumerator ie;
while (ie.MoveNext())
{
var item = ie.Current;
}

其中,MoveNext()每调用一次,就会访问一个对象,但是这个MoveNext()可以被决定在什么时候调用,不一定是在一个循环中一次性执行完毕,

也可以决定每帧执行一次,甚至还可以等待某种条件达成时才继续执行,等等。

如此,协程可以自然的将某一串操作分摊到多帧中执行,给人一种类似多线程的效果,但是这不是多线程。

yield关键字

yield是C# 2.0开始提供的一个语法糖。它允许方便的建立一个返回IEnumerator接口对象的方法。

如果方法被声明为返回IEnumerator接口,则在方法体内可以用yield 指示编译器创建集合元素,将我们用yield返回的对象添加到集合中,并且自动生成实现IEnumerator接口的对象并返回。

使用yield可以非常方便的创建IEnumerator接口对象。

Unity协程的等待条件

如前所述,IEnumerator 接口每次访问,可以获取当前集合对象。这个当前集合对象被Unity拿来做文章,

通过它来指示Unity对这个协程的下一步操作行为,例如是继续等待,或者是调用MoveNext来将协程中的方法推进到下一步。

CustomYieldInstruction 自定义中断指令

CustomYieldInstruction实现自定义中断指令来暂停协程执行,直到事件发生。要实现这个,需要继承自CustomYieldInstruction类,并重写keepWaiting属性。

如果希望保持协程暂停,则返回true,希望协程继续执行则返回false。

在热更新脚本中实现

按照Unity的示例,它展示了当点击鼠标左键时,启动一个协程,然后此协程一直等待,直到鼠标右键被点击后继续执行。

我们可以直接在热更新中移植实现如上逻辑。

  1. 创建一个新的热更项目。如果不会创建,参考这里
  2. 将Main.as代码改为如下代码:
    package
    {
    /**
    * ...
    * @author
    */
    public class Main
    {
    public function Main() {}
    public function update():void {}
    }
    } import unityengine.Camera;
    import unityengine.CustomYieldInstruction;
    import unityengine.Input;
    import unityengine.MonoBehaviour; // Example showing how a CustomYieldInstruction script file
    // can be used. This waits for the left button to go up and then
    // waits for the right button to go down. class ExampleScript extends MonoBehaviour
    {
    function Update():void
    {
    //当点击左键时,启动协程。waitForMouseDown
    if (Input.getMouseButtonUp(0))
    {
    trace("Left mouse button up");
    startCoroutine(Iterator(waitForMouseDown())); //协程需要用Iterator包装一下.
    }
    } function waitForMouseDown()
    {
    //使用自定义的CustomYieldInstruction子类。
    yield return new WaitForMouseDown();
    trace("Right mouse button pressed");
    }
    } class WaitForMouseDown extends CustomYieldInstruction
    {
    override public function get keepWaiting():Boolean
    {
    //当没有检测到右键点击时,一直保持等待状态。
    return !Input.getMouseButtonDown(1);
    } public function WaitForMouseDown()
    {
    trace("Waiting for Mouse right button down");
    }
    } //测试脚本。
    Camera.main.gameObject.addComponent(ExampleScript);
  3. 编译代码,然后在Unity中点击执行。
  4. 运行结果如下

如此,我们就了解了如何在热更新中操作协程

用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- CustomYieldInstruction 自定义中断指令的更多相关文章

  1. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新

    unity热更新是一个经久不衰的话题.除了最常见的lua之外,还有如JSBinding,C#等等.这里介绍一个使用ECMAScript4进行热更新的方案.它吸收了各家的优点,特色很鲜明. 项目地址: ...

  2. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用原型链和EventTrigger

    原型链是JS的必备,作为ECMAScript4,原型链也是支持的. 特别说明,ActionScript3是支持完整的面向对象继承支持的,原型链只在某些非常特殊的情况下使用. 本文旨在介绍如何使用原型链 ...

  3. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- Demo分析

    如何创建工程 下载最新的Unity发布插件包. 打开Unity,新建一个项目 将插件包导入 在菜单中点击ASRuntime/Create ActionScript3 FlashDevelop HotF ...

  4. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用第三方组件

    Unity开发中,常常会用到一些第三方组件.本文以实例介绍如何在热更新脚本中使用这些第三方组件. 首先说明几个基本步骤: 第三方组件通常是以dll或者源码方式提供的,它们本身往往无法热更. 我们在脚本 ...

  5. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用FairyGUI (一)

    我们的热更新脚本在实际使用中,当然也要支持常用的第三方组件,例如这里介绍一个非常实用的第三方UI库:FairyGUI. 什么是FairyGUI 这里照搬FaiyGUI官网的介绍: 重新定义 UI 制作 ...

  6. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用FairyGUI (二)

    上次讲解了FairyGUI的最简单的热更新办法,并对其中一个Demo进行了修改并做成了热更新的方式. 这次我们来一个更加复杂一些的情况:Emoji. FairyGUI的   Example 04 - ...

  7. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 热更新Live2D

    live2D是一个很强大的2D动画组件.我们可以使用AS3脚本对它进行热更新. live2D在Unity中的使用请看这里: 如何获取Live2D 总得来说,我们可以先去live2D官网下载它的Unit ...

  8. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 在脚本中使用MonoBehaviour

    继上次分析了热更新的Demo后,这次来介绍如何在热更新代码中使用MonoBehaviour. MonoBehaviour挂载到GameObject对象上的脚本的基类.平常Unity开发时,简单的做法就 ...

  9. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 操作符重载和隐式类型转换

    C#中,某些类型会定义隐式类型转换和操作符重载.Unity中,有些对象也定义了隐式类型转换和操作符重载.典型情况有:UnityEngine.Object.UnityEngine.Object的销毁是调 ...

随机推荐

  1. java实现两个int数交换

    普通方法,进阶方法,大神方法 @Test public void test3(){ int m = 5; int n = 12; //要求m和n交换位置 System.out.println(&quo ...

  2. TR069网管协议应用在Android系统开发的前言

    随着智能平台的终端设备不断发展,迫切需要我们解决这些终端的管理问题,而现有的终端统一管理平台已经成熟,主要是基于tr069协议网管平台,比如华为的itms等终端管理平台.所以,这篇文章就是为了实现一种 ...

  3. 关于tr069网管开发系列教程

    原创作品,转载请注明出处,严禁非法转载.如有错误,请留言! email:40879506@qq.com 声明:本系列涉及的开源程序代码学习和研究,严禁用于商业目的. 如有任何问题,欢迎和我交流.(企鹅 ...

  4. [Kaggle] dogs-vs-cats之制作数据集[1]

    Step 0:导入必要的库 import tensorflow as tfimport os Step 1:获取图片文件名以及对应的标签 首先是读取给定路径下所有图片的名称以及对应的标签.os.lis ...

  5. isinstance(obj1,class) 可以判断前者是否是后者的实例

    isinstance(obj1,class) 可以判断前者是否是后者的实例

  6. Text-鼠标点击事件

    from tkinter import * import webbrowser master=Tk() text=Text(master,width=50,height=20) text.pack() ...

  7. ●BZOJ 4826 [Hnoi2017]影魔

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4826 题解: 主席树,单调栈 以前还没做过这种维护信息的题,感觉好奇妙. 每对相邻的两个数所 ...

  8. SPOJ DQUERY树状数组离线or主席树

    D-query Time Limit: 227MS   Memory Limit: 1572864KB   64bit IO Format: %lld & %llu Submit Status ...

  9. 习题9-6 uva 10723

    题意: 给你两个字符串,求一个最短的串,使得输入的两个串均是他的子序列(不一定连续) 思路: 可以看出ans = 两个串的长度和 - 两个串的最长公共子序列,在最后的构造处GG.  在构造时想了很久, ...

  10. hdu5587 BestCoder Round #64 (div.2)

    问题描述 Vicky是个热爱数学的魔法师,拥有复制创造的能力. 一开始他拥有一个数列{1}.每过一天,他将他当天的数列复制一遍,放在数列尾,并在两个数列间用0隔开.Vicky想做些改变,于是他将当天新 ...