用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

更多关于此项目的使用方法,可以去官网查看文档。欢迎大家提出意见或建议。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏代码世界

Python之IO模型

IO模型介绍 为了更好地了解IO模型,我们需要事先回顾下:同步、异步、阻塞、非阻塞     同步(synchronous) IO和异步(asynchronous...

44111
来自专栏抠抠空间

爬虫简介

2010
来自专栏LanceToBigData

struts2(一)之初识struts2

前言   我们都知道struts2是一个框架,那什么是框架呢?很多人其实不太明白,其实框架就是一个半成品,别人将一些功能已经写好了,我们只需要拿来用即可,像我们...

2319
来自专栏云飞学编程

python爬虫零基础入门——反爬的简单说明

之前在《如何开始写你的第一个python脚本——简单爬虫入门!》中给大家分享了一下写一个爬虫脚本的基本步骤,今天继续分享给大家在初期遇到的一个很烦人的问题——反...

993
来自专栏chenssy

【死磕Sharding-jdbc】---orchestration简介使用

sharding-jdbc2.x核心功能之一就是orchestration,即编排治理,什么意思呢?官方文档介绍--2.0.0.M1版本开始,sharding-...

2624
来自专栏Java学习123

Centos 6.4 python 2.6 升级到 2.7

37412
来自专栏信安之路

记一次审计 xiaocms 的过程

周末在家刚吃完晚饭,基友 DM 叫我一起来审计 xiaocms 系统,也不知道他是受到啥刺激了。正好,除了 Code Review 公司项目代码及框架代码,未审...

7490
来自专栏Java成神之路

Tomcat_异常_02_IOException while loading persisted sessions: java.io.EOFException

     EOFException表示输入过程中意外地到达文件尾或流尾的信号,导致从session中获取数据失败。

841
来自专栏Crossin的编程教室

Python 实战(1):在网页上显示信息

上次简单介绍了 web.py。今天先来粗略解释下那个 hello world 页面的代码: import web 导入 web.py 模块。 urls = ( ...

3507
来自专栏沈唁志

ThinkPHP-PHP开发中的主流框架

8484

扫码关注云+社区

领取腾讯云代金券