如何创建工程

  1. 下载最新的Unity发布插件包。
  2. 打开Unity,新建一个项目
  3. 将插件包导入
  4. 在菜单中点击ASRuntime/Create ActionScript3 FlashDevelop HotFixProject
  5. 此时系统会自动创建工程,并且自动将常用的Unity函数生成可供范围的API代码。
  6. 热更工程的目录结构是这样的
  7. 其中,bat/CreateUnityAPI.bat,可以手动再次生成API。比如修改了需要导出的配置等,此时可以执行这个bat重新生成
  8. bat/CompileCode.bat 可以编译字节码并发布到Unity工程。如果没有安装IDE,则用记事本和这个批处理,同样可以进行热更新开发
  9. 点击FlashDevelop的编译按钮,即可编译热更新字节码
  10. 默认配置中,将热更新字节码生成到Unity工程的    StreamingAssets\hotfix.cswc 中。实际情况可以按需要修改。

Demo详解

这个Demo场景提供了一些元素,可以概览热更项目的执行流程。

Unity工程部分

  • AS3Player   一个GameObject。它挂载了ActionScriptStartUp.cs 脚本。这个脚本承载了初始化脚本引擎的所有功能。
  • Canvas       下的元素,是UGUI的界面组件,包括一个按钮,一个文本框,一个进度条。这些在Demo中演示了如何对这些物体交互。实际情况,可以定制

我们来看ActionScriptStartUp.cs脚本,它是如何初始化的。

  1. 在Start()函数中返回IEnumerator。通知Unity这个启动过程是一个协程。可以在多帧中完成
  2. 找到场景中的进度条UI元素。已提供加载的进度条指示
  3. 指示Unity,本GameObject不要在切换场景时卸载。它保存了脚本引擎。
  4. 创建脚本引擎实例
  5. 读取脚本的字节码。(Demo中从streamingAssetsPath中加载,实际情况则可以从网络下载。如此即达到了热更新的目的)
  6. 注册Unity的API。  (Unity的API可能有数千个之多。这里使用协程的目的就是可以在这步提供进度条)
  7. 引擎加载字节码,准备执行。
  8. 引擎创建字节码中某个类型的实例(Demo中为Main)
  9. 引擎获取实例的某个方法 (Demo中为update)
  10. ActionScriptStartUp的Update方法中,引擎驱动热更类型的update方法,执行热更逻辑。

其中,第9,10步不是必须的。因为热更代码中也可以继承Monobehaviour,只需在入口类型的构造函数或者包外代码中,写了相应逻辑,同样可以实现。

同样,UI进度条部分代码也可以剔除改成自己的界面逻辑,或者,直接全部加载,不使用进度条也是可行的。

现在在Unity中点击播放,可看到如下场景:

热更新脚本部分

现在切换到热更新工程,双击Main.as,打开热更新脚本代码:

  1 package
  2 {
  3     import unityengine.GameObject;
  4     import unityengine.MeshRenderer;
  5     import unityengine.PrimitiveType;
  6     import unityengine.Random;
  7     import unityengine.Time;
  8     import unityengine.UObject;
  9     import unityengine.Vector3;
 10     import unityengine.ui.Button;
 11     import unityengine.ui.Text;
 12
 13     [Doc]
 14     /**
 15      * ...
 16      * @author
 17      */
 18     public class Main
 19     {
 20
 21         //使用 Vector.<>列表,保存所有的物体
 22         var cubes:Vector.<GameObject> = new Vector.<GameObject>();
 23         //使用 Vector.<>列表,保存每个物体的位移速度。
 24         var mvs:Vector.<Vector3> = new Vector.<Vector3>();
 25
 26         public function Main()
 27         {
 28
 29             var cube:UObject = GameObject.find("Cube");
 30             //创建100个立方体。
 31             for (var i:int = 0; i < 100; i++)
 32             {
 33                 //创建立方体
 34                 var c2:GameObject = GameObject.createPrimitive( PrimitiveType.Cube);
 35                 //给立方体设置材质
 36                 MeshRenderer( c2.getComponent(MeshRenderer)).material = MeshRenderer( GameObject( cube).getComponent(MeshRenderer)).material;
 37                 //设置立方体的初始位置
 38                 c2.transform.position = new Vector3( Random.range(-5,5),Random.range(0,5),Random.range(-5,5) );
 39                 //将立方体加入列表中
 40                 cubes.push(c2);
 41                 //初始化立方体的移动速度。
 42                 mvs.push( new Vector3(Random.range( -5, 5), Random.range(-5, 5), Random.range( -5, 5)) );
 43                 mvs[mvs.length - 1].normalize();
 44
 45             }
 46
 47             //查找UI界面的button。
 48             var btn:Button = Button( GameObject.find("Button").getComponent(Button));
 49             //给Button加入事件。
 50             btn.onClick.addListener(
 51                 onclick        //onclick是一个方法。可以直接将方法穿递给C#委托。
 52             );
 53
 54
 55         }
 56
 57         private function onclick()
 58         {
 59             isstop = !isstop;
 60             trace("isstop?" , isstop);
 61             //更新UI中Text的值
 62             Text( GameObject.find("Canvas/Text").getComponent(Text)).text = "isstop?" + isstop
 63
 64             +"我在AS3中热更"
 65             ;
 66
 67         }
 68
 69         private var isstop:Boolean = false;
 70         public function update():void
 71         {
 72             if (isstop)
 73                 return;
 74
 75             for (var i:int = 0; i < 100; i++)
 76             {
 77
 78                 var cube:GameObject = cubes[i];
 79                 var v:Vector3 = mvs[i];
 80
 81                 //更新每个物体的位置。
 82                 //可以看到使用了操作符重载,可以使用   Vector3 * Number 来直接给位置赋值。
 83                 cube.transform.localPosition += v * Time.deltaTime;
 84
 85                 var p:Vector3 = cube.transform.localPosition;
 86                 if (p.x <-5 || p.y < -5 || p.z < -5 || p.x > 5 || p.y > 5 || p.z > 5)
 87                 {
 88                     //如果物体达到了边界,则将速度反转。
 89                     //可以看到操作符重载。
 90                     mvs[i] =-mvs[i];
 91                 }
 92
 93             }
 94
 95             //***其中Vector3是结构体。可以在Unity Profiler中查看临时内存开销,可以看到GC数为0.也就是完全没有任何内存开销
 96
 97         }
 98
 99     }
100
101 }

可以看到,构造函数中,构造了100个立方体,并且设置了它们的初始信息。

然后 update函数中,由于每帧的调用,这些立方体动了起来。

使用Unity Profiler,可以看到,每帧中的100次循环和Vector3操作,没有产生任何的GC开销。

现在我们修改一下脚本:在创建立法体的地方,将立方体改为胶囊:

编译后,Unity工程中即可看到效果。

转载于:https://www.cnblogs.com/ashei/p/8874618.html

用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- Demo分析相关推荐

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

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

  2. 【文集】Unity的热更新

    热更新对游戏很重要,但是unity自身是不支持热更新的,因此这方面还是有不少方案和文章 Unity热更新之LuaInterface(上篇) Unity热更新之LuaInterface(下篇) Lua ...

  3. Unity HybridCLR热更新技术实现

    最近我们在项目中遇到了一个问题:经常需要修改游戏逻辑,如果每次修改都需要重新打包发布,那将会非常耗时,于是我们开始寻找解决方案.最后我们找到了 Unity HybridCLR 热更新技术,实现了游戏逻 ...

  4. [Unity3D学习]Unity代码热更新 源码下载

    转载自:http://blog.gamerisker.com/archives/608.html 之前的一篇文章<[Unity3D学习]Unity代码热更新解决方案测试结果总结>只是说了一 ...

  5. 【Unity】热更新插件【ULua】学习教程整理

    前言 IOS不能热更新,不是因为不能用反射,是因为 System.Reflection.Assembly.Load 无法使用 System.Reflection.Emit 无法使用 System.Co ...

  6. unity python热更新_Unity热更新介绍和测试方法

    最近项目中增加了热更新了功能,程序也完成了相应的开发,接下来就需要对这个模块进行相应的测试工作了,在测试开始之前,了解下其原理总是很有好处的. 1:什么是热更新 简单的理解就是:用户重启客户端就能实现 ...

  7. uLua,一个Unity+Lua热更新解决方案!

    原文:http://game.ceeger.com/forum/read.php?tid=16483&fid=16 看了坛子上同学用Kopilua,以为真的跨平台没问题,就实验了安卓手机,然后 ...

  8. uLua最新的Unity+Lua热更新解决方案!!!

    看了坛子上同学用Kopilua,以为真的跨平台没问题,就实验了安卓手机,然后就开始铺游戏框架,干了一星期到昨晚想起来到ipad上跑跑,然后我跟我的小Demo一起崩溃了.今天搜索luajit,终于在u3 ...

  9. [置顶] 【稀饭】react native 实战系列教程之热更新原理分析与实现

    很多人在技术选型的时候,会选择RN是因为它具有热更新,而且这是它的一个特性,所以实现起来会相对比较简单,不像原生那样,原生的热更新是一个大工程.那就目前来看,RN的热更新方案已有的,有微软的CodeP ...

最新文章

  1. expdp oracle 并行_oracle 11g逻辑备份介绍-expdp/impdp
  2. 怎么知道网站是用什么程序做的
  3. 46.一个例子了解C++中异常处理
  4. ABAP delete的用法
  5. LVS集群之DR模式
  6. 解决Oracle jdbc驱动包maven下载失败问题
  7. kafka 重新分配节点_Kafka控制器-分区重分配
  8. JS中setInterval、setTimeout不能传递带参数的函数的解决方法
  9. java 网页通讯_Vue+Java 通过websocket实现服务器与客户端双向通信操作
  10. php 图片裁剪保存,PHP图片裁剪与缩放示例(无损裁剪图片)
  11. mysql数据库季度函数_数据库之MySQL函数(二)
  12. 文件及文件夹删除失败的解决方法
  13. 超简单!Oneplus一加手机安装谷歌服务框架Google Play商店下载应用,安装谷歌三套件
  14. 五千字!详细解读链家「难而正确的事」
  15. 达内python第一次月考题目_月考来临!第一次月考远比你想象的重要!
  16. 802.11 Backoff Timer,bugFix_timer_
  17. Python uiautomation初探,测试Win10计算器
  18. CSS-flex弹性布局补充
  19. 一文读懂量子计算的原理、分类与发展
  20. tpx色卡电子版_潘通色卡电子版下载

热门文章

  1. 机器人杆长标定_关于机器人标定,还有这些内幕你必须知道
  2. 【产品】禅道项目管理核心思想
  3. java 鉴黄_真香,我把百万鉴黄服务源码开源了
  4. linux 设置系统时钟,linux clock命令查看和设置硬件时钟
  5. Vendor NDK
  6. 家庭用电都是交流电,为何会有零线和火线的区别?
  7. 使用域名访问后台系统、Nginx反向代理服务器
  8. measure_solder_paster_dff.hdev测量BGA封装焊锡膏深度的 相关例程学习
  9. Java破解9X9数独小游戏
  10. 用JS怎么判断上传文件控件是否未选择文件