游戏蛮牛学习群(纯技术交流,不闲聊):159852603
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

教程分享

关注:791

当前位置:游戏蛮牛 技术专区 教程分享

查看: 826|回复: 3

[系列教程] 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- CustomYieldInstruction 自定义中断指令

[复制链接]  [移动端链接]
排名
61967
昨日变化
44

7

主题

9

帖子

30

积分

Rank: 1

UID
83362
好友
0
蛮牛币
100
威望
0
注册时间
2015-3-23
在线时间
12 小时
最后登录
2018-5-21
发表于 2018-4-28 13:50:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 ashei 于 2018-4-28 13:50 编辑

ActionScript3脚本引擎为了方便热更新逻辑开发,提供的从脚本继承Unity类库功能在一些情况下可以提供开发的便利。
这次来建立一个示例,演示一下如何在脚本中自定义协程中断指令
Unity中的协程
unity中协程经常被用到,从本质上来讲,当调用startCoroutine时,传入的参数是一个实现IEnumerator接口的对象。
IEnumerator接口是一个集合访问器,可以使用类似如下代码访问集合中的所有对象。
[C#] 纯文本查看 复制代码
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代码改为如下代码:
    [AppleScript] 纯文本查看 复制代码
    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中点击执行。我们看到了正确的执行流程。
  • 46491-20180428133125361-1352934078.png
如此,我们就了解了如何在热更新中操作协程

[发帖际遇]: ashei 在论坛发帖时没有注意,被小偷偷去了 2 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

7日久生情
3301/5000
排名
1941
昨日变化
7

0

主题

2122

帖子

3301

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
219676
好友
1
蛮牛币
2410
威望
0
注册时间
2017-7-12
在线时间
513 小时
最后登录
2018-10-19

活力之星

发表于 2018-4-28 17:13:14 | 显示全部楼层
谢谢分享

回复

使用道具 举报

3偶尔光临
254/300
排名
8266
昨日变化
3

0

主题

27

帖子

254

积分

Rank: 3Rank: 3Rank: 3

UID
25195
好友
1
蛮牛币
291
威望
0
注册时间
2014-5-15
在线时间
90 小时
最后登录
2018-10-10
QQ
发表于 2018-5-9 09:52:39 | 显示全部楼层
好用,感谢,as3写起来很舒服
[发帖际遇]: hwbin2002 发帖时在路边捡到 1 蛮牛币,偷偷放进了口袋. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

排名
61967
昨日变化
44

7

主题

9

帖子

30

积分

Rank: 1

UID
83362
好友
0
蛮牛币
100
威望
0
注册时间
2015-3-23
在线时间
12 小时
最后登录
2018-5-21
 楼主| 发表于 2018-5-10 19:33:09 | 显示全部楼层
hwbin2002 发表于 2018-5-9 09:52
好用,感谢,as3写起来很舒服

谢谢支持!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表