用ECMAScript4 ( ActionScript3) 实现Unity的热更新
unity热更新是一个经久不衰的话题。除了最常见的lua之外,还有如JSBinding,C#等等。这里介绍一个使用ECMAScript4进行热更新的方案。它吸收了各家的优点,特色很鲜明。
- 项目地址:
https://github.com/asheigithub/apple-juice-actionscript
什么是ECMAScript4?
ECMAScript4事实上并没有正式推出,浏览器的ES标准是从ES3直接跳到ES5,现在是ES6.这其中夹杂大量政治因素,具体可以去百度。
但无论如何ECMAScript4 是完整支持类型,接口,继承,编译期类型检查的强类型脚本语言,同时又支持动态属性访问,原型链继承等,同时有IDE支持,非常适合较大规模的项目开发。
事实上ECMAScript4的唯一实现,就是ActonScript3。
热更新原理
这是一个用纯.net2.0实现的ActionScript3编译器和虚拟机。它只使用了.net2.0的语法,因此可以在任何提供.net2.0执行环境的地方运行脚本。即使环境不提供JIT功能(例如Unity在IOS上,或者IL2CPP打包的安卓系统上)也同样不受影响。
热更新项目提供了一个Unity插件包和一个SDK文件夹。插件包导入Unity工程后,可以在菜单内创建脚本工程,会自动设置好各种路径,如果没有安装IDE,使用bat批处理文件也可以编译代码发布到Unity来体验。
特色功能
它和其他热更新方案相比,主要有以下一些特点:
1. 包括完整的编译器和虚拟机。其他热更新方案,大多是嵌入某个第三方语言运行时(例如LUA),这个则不需要。它全部以代码提供,整个虚拟机都是代码,直接导入Unity即可执行.
2. 语法友好,纯ECMAScript4语法,当JS用即可。同时有完整的面向对象以及IDE支持。
3. 编译器为Unity优化语法。可以直接在脚本内编写Unity协程。
4. 编译器为Unity的Monobehaviour优化,可以直接在脚本中定义Monobehaviour,并挂载。
5. 对.net结构体有特殊优化,在脚本内使用结构体时,只要不保存到堆中,即不会产生任何GC。
6. 对.net对象有特殊优化。在脚本内创建.net类库的对象时,只要不保存到脚本对象中,就不会产生额外的对象分配。
7. 支持操作符重载。unity中有许多操作符重载。例如Vector3的+-*/等。这些操作符重载在脚本中同样可以直接使用。
8. 可以在脚本中继承.net的类型。而且还可以用脚本来override .net基类的虚方法。
9. 将unity的类型导出到脚本中作为API的步骤是全自动进行的。而且导出后的API还同样保持了继承关系。
实际开发环境截图:

如图,可以看到脚本中直接继承了MonoBehaviour。 IDE提供了GameObject的各种静态方法的智能感知。API提示明确显示了原 Unity C# API的签名等。
性能
官网上有一个和slua的对比。
https://asheigithub.github.io/apple-juice-actionscript/doc_cn/2-4-0-slua-applejuice-2018-04-12/
Unity交互部分性能大致相当,某些地方略胜lua。测试环境均为无法jit的il2cpp打包手机环境实测。测试手机为魅蓝NOTE5

简易使用入门
使用前先确认安装如下环境:
- FlashDevelop。这是一个开源的IDE,可以用来开发脚本。下载地址http://www.flashdevelop.org/
- JRE 。 编译器需要JRE支持,只要安装任意 > 1.5版本的JRE即可。
从官网下载最新的发布包。
并解压。
解压后包括SDK文件夹一个,Unity插件包一个。
项目创建步骤:
1. 先创建一个Unity工程。然后导入UnityPackage内的Unity插件包。
2. 点击菜单 ASRuntime/Create ActionScript3 FlashDevelop HotFixProj。
3. 根据提示先定位SDK的位置。
4. 然后根据提示创建AS3热更新项目。项目创建完成后,会根据默认配置生成Unity的API。
脚本项目要求创建在一个空白的文件夹中。
项目测试:
1. 在Unity工程中,打开测试场景"Assets/HotFixDemoScene1.scene"。
2. 在刚才生成的ActionScript3工程目录中,用FlashDevelop打开<protname>.as3proj 工程文件。
3. 在AS3工程中修改代码
4. 点击FlashDevelop的编译按钮,进行编译
5. 回到Unity工程,点击播放,即可看到修改的结果。
下面有一个gif动态图,演示了从创建项目到热更的过程。gif文件有9M,如果不显示请稍待

Demo
最后,我做了一个热更新的修改DEMO:将Unity引导内的 roll-a-ball修改为使用脚本驱动的热更新版本。并且修改部分代码,以支持手机上的重力感应操作。可以用il2cpp打包到安卓手机上查看效果。
下载链接: https://files.cnblogs.com/files/ashei/rollaball.zip
更多关于此项目的使用方法,可以去官网查看文档。欢迎大家提出意见或建议。
用ECMAScript4 ( ActionScript3) 实现Unity的热更新的更多相关文章
- 用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的热更新 -- CustomYieldInstruction 自定义中断指令
ActionScript3脚本引擎为了方便热更新逻辑开发,提供的从脚本继承Unity类库功能在一些情况下可以提供开发的便利. 这次来建立一个示例,演示一下如何在脚本中自定义协程中断指令 Unity中的 ...
- 用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的销毁是调 ...
随机推荐
- 【Linux】 升级CentOS6的内核到3.10
升级内核 最近有一些虚拟机,想装Dokcer,但是实验之后发现Docker基本上只在3.0以上的linux内核版本中才能稳定运行.所以就面临着把CentOS6的2.6内核升级到3.0以上.下面提供两种 ...
- Hibernate学习(2)- hibernate.cfg.xml详解
1:主配置文件主要分为三部分: 注意:通常情况下,一个session-factory节点代表一个数据库: 1.1:第一部分 数据库连接部分,注意"hibernate.connection.d ...
- oracle 分析函数中 keep关键字的使用
语法 min | max(column1) keep (dense_rank first | last order by column2) over (partion by column3); 另外f ...
- Java基础学习笔记七 Java基础语法之继承和抽象类
继承 继承的概念 在现实生活中,继承一般指的是子女继承父辈的财产.在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系. 例如公司中的研发部员工和维护部员工都属于员工, ...
- 简单hdfs相关操作命令
HDFS常用操作命令 启动hdfs #start-all.sh 查看hdfs的配置文件 #cat hdfs-site.sh #hadoop fs -put /soft/jdk / #HDFS上传文件命 ...
- beta冲刺2
q前言:今天晚上大概把github的的相关东西弄上了.然后把之前做的一些修改什么的也上传上去了.目测之后的话就是在自己这边改完然后直接上github那边去复制粘贴替换掉了. 昨天的问题:github这 ...
- JVM笔记7-内存分配与回收策略
1.对象优先在Eden分配 大多数情况下,对象在新生代Eden区中分配.当Eden区中没有足够空间分配时,虚拟机将发起一次Minor GC.虚拟机提供了-XX:PrintGCDetails 这个收集器 ...
- ASCII排序
ASCII码排序 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符. 输入 第一行输 ...
- css3动画transition详解
一.transition-property 语法: transition-property : none | all | [ <IDENT> ] [ ',' <IDENT> ] ...
- php的格式化数字函数
php格式化数字:位数不足前面加0补足 php格式化数字:位数不足前面加0补足 感谢:http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/12 ...