前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- CustomYieldInstruction 自定义中断指令

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

作者头像
用户1687945
发布2018-05-02 11:17:30
1.4K0
发布2018-05-02 11:17:30
举报
文章被收录于专栏:烙馅饼喽的技术分享

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

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

Unity中的协程

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

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

代码语言:javascript
复制
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代码改为如下代码:
代码语言:javascript
复制
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);
  1. 编译代码,然后在Unity中点击执行。
  2. 运行结果如下

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-04-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Unity中的协程
  • yield关键字
  • Unity协程的等待条件
  • CustomYieldInstruction 自定义中断指令 
  • 在热更新脚本中实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档