用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- CustomYieldInstruction 自定义中断指令
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的示例,它展示了当点击鼠标左键时,启动一个协程,然后此协程一直等待,直到鼠标右键被点击后继续执行。
我们可以直接在热更新中移植实现如上逻辑。
- 创建一个新的热更项目。如果不会创建,参考这里
- 将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); - 编译代码,然后在Unity中点击执行。
- 运行结果如下
如此,我们就了解了如何在热更新中操作协程
用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- CustomYieldInstruction 自定义中断指令的更多相关文章
- 用ECMAScript4 ( ActionScript3) 实现Unity的热更新
unity热更新是一个经久不衰的话题.除了最常见的lua之外,还有如JSBinding,C#等等.这里介绍一个使用ECMAScript4进行热更新的方案.它吸收了各家的优点,特色很鲜明. 项目地址: ...
- 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用原型链和EventTrigger
原型链是JS的必备,作为ECMAScript4,原型链也是支持的. 特别说明,ActionScript3是支持完整的面向对象继承支持的,原型链只在某些非常特殊的情况下使用. 本文旨在介绍如何使用原型链 ...
- 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- Demo分析
如何创建工程 下载最新的Unity发布插件包. 打开Unity,新建一个项目 将插件包导入 在菜单中点击ASRuntime/Create ActionScript3 FlashDevelop HotF ...
- 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用第三方组件
Unity开发中,常常会用到一些第三方组件.本文以实例介绍如何在热更新脚本中使用这些第三方组件. 首先说明几个基本步骤: 第三方组件通常是以dll或者源码方式提供的,它们本身往往无法热更. 我们在脚本 ...
- 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用FairyGUI (一)
我们的热更新脚本在实际使用中,当然也要支持常用的第三方组件,例如这里介绍一个非常实用的第三方UI库:FairyGUI. 什么是FairyGUI 这里照搬FaiyGUI官网的介绍: 重新定义 UI 制作 ...
- 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用FairyGUI (二)
上次讲解了FairyGUI的最简单的热更新办法,并对其中一个Demo进行了修改并做成了热更新的方式. 这次我们来一个更加复杂一些的情况:Emoji. FairyGUI的 Example 04 - ...
- 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 热更新Live2D
live2D是一个很强大的2D动画组件.我们可以使用AS3脚本对它进行热更新. live2D在Unity中的使用请看这里: 如何获取Live2D 总得来说,我们可以先去live2D官网下载它的Unit ...
- 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 在脚本中使用MonoBehaviour
继上次分析了热更新的Demo后,这次来介绍如何在热更新代码中使用MonoBehaviour. MonoBehaviour挂载到GameObject对象上的脚本的基类.平常Unity开发时,简单的做法就 ...
- 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 操作符重载和隐式类型转换
C#中,某些类型会定义隐式类型转换和操作符重载.Unity中,有些对象也定义了隐式类型转换和操作符重载.典型情况有:UnityEngine.Object.UnityEngine.Object的销毁是调 ...
随机推荐
- AWS stolen CPU
故事的开头是这样的: 一天我正在吃饭,突然就收到了服务器告警(cpu high load),吓的我饭也没吃好,只吃了三碗就回去处理故障了,我在监控上看到了这样子的图: 看见了吧,吃饭那段时间cpu一下 ...
- EF5中 执行 sql语句使用Database.ExecuteSqlCommand 返回影响的行数 ; EF5执行sql查询语句 Database.SqlQuery 带返回值
一: 执行sql语句,返回受影响的行数 在mysql里面,如果没有影响,那么返回行数为 -1 ,sqlserver 里面 还没有测试过 using (var ctx = new MyDbConte ...
- 拿来主义:layPage分页插件的使用
布衣之谈 所谓插件,大概就是项目中可插可拔的比较小功能化的组件:这些功能组件若能力可及,自己也可以完成——也即自己造轮子,但翻看各种技术社区,相关领域的神人们往往会有更好的实现方案贡献出来,这个时候你 ...
- 查看 Secret - 每天5分钟玩转 Docker 容器技术(156)
可以通过 kubectl get secret 查看存在的 secret. 显示有两个数据条目,kubectl describe secret 查看条目的 Key: 如果还想查看 Value,可以用 ...
- 利用JS去做响应式布局
利用JS去做响应式布局 js动态改变布局方式 // 取浏览器可视区高宽 var lw = $(window).width(); var lh = $(window).height();// 页面加载完 ...
- Java多线程之interrupt()的深度研究
近期学习Java多线程的中断机制,网上的帖子说得很浅,并没深究其原理.看了Java源码,对Java的中断机制有了略深入的理解,在这篇文章中向感兴趣的网友分享下.这篇文章主要通过一个典型例子对中断机制进 ...
- [LeetCode] Valid Square 验证正方形
Given the coordinates of four points in 2D space, return whether the four points could construct a s ...
- 关于自定义view--实现自定义水波纹效果
开发中的东西太多,怕自己忘记了,简单记录一下. 声明:此控件借鉴了大佬的想法,在此感谢大佬提供的支持,我只是把大佬的想法拿出来而已. ok,废话到此结束,看效果: 分析一下,我们可以看到,图中有两个圆 ...
- [ Java学习基础 ] Java的封装性与访问控制
Java面向对象的封装性是通过对成员变量和方法进行访问控制实现的,访问控制分为4个等级:私有.默认.保护和公有,具体规则如下表: 1.私有级别 私有级别的关键字是private,私有级别的成员变量和方 ...
- 【bzoj4443 scoi2015】小凸玩矩阵
题目描述 小凸和小方是好朋友,小方给了小凸一个 nn × mm (n \leq m)(n≤m) 的矩阵 AA ,并且要求小凸从矩阵中选出 nn 个数,其中任意两个数都不能在同一行或者同一列.现在小凸想 ...