如何创建工程

  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,打开热更新脚本代码:

 package
{
import unityengine.GameObject;
import unityengine.MeshRenderer;
import unityengine.PrimitiveType;
import unityengine.Random;
import unityengine.Time;
import unityengine.UObject;
import unityengine.Vector3;
import unityengine.ui.Button;
import unityengine.ui.Text; [Doc]
/**
* ...
* @author
*/
public class Main
{ //使用 Vector.<>列表,保存所有的物体
var cubes:Vector.<GameObject> = new Vector.<GameObject>();
//使用 Vector.<>列表,保存每个物体的位移速度。
var mvs:Vector.<Vector3> = new Vector.<Vector3>(); public function Main()
{ var cube:UObject = GameObject.find("Cube");
//创建100个立方体。
for (var i:int = 0; i < 100; i++)
{
//创建立方体
var c2:GameObject = GameObject.createPrimitive( PrimitiveType.Cube);
//给立方体设置材质
MeshRenderer( c2.getComponent(MeshRenderer)).material = MeshRenderer( GameObject( cube).getComponent(MeshRenderer)).material;
//设置立方体的初始位置
c2.transform.position = new Vector3( Random.range(-5,5),Random.range(0,5),Random.range(-5,5) );
//将立方体加入列表中
cubes.push(c2);
//初始化立方体的移动速度。
mvs.push( new Vector3(Random.range( -5, 5), Random.range(-5, 5), Random.range( -5, 5)) );
mvs[mvs.length - 1].normalize(); } //查找UI界面的button。
var btn:Button = Button( GameObject.find("Button").getComponent(Button));
//给Button加入事件。
btn.onClick.addListener(
onclick //onclick是一个方法。可以直接将方法穿递给C#委托。
); } private function onclick()
{
isstop = !isstop;
trace("isstop?" , isstop);
//更新UI中Text的值
Text( GameObject.find("Canvas/Text").getComponent(Text)).text = "isstop?" + isstop +"我在AS3中热更"
; } private var isstop:Boolean = false;
public function update():void
{
if (isstop)
return; for (var i:int = 0; i < 100; i++)
{ var cube:GameObject = cubes[i];
var v:Vector3 = mvs[i]; //更新每个物体的位置。
//可以看到使用了操作符重载,可以使用 Vector3 * Number 来直接给位置赋值。
cube.transform.localPosition += v * Time.deltaTime; var p:Vector3 = cube.transform.localPosition;
if (p.x <-5 || p.y < -5 || p.z < -5 || p.x > 5 || p.y > 5 || p.z > 5)
{
//如果物体达到了边界,则将速度反转。
//可以看到操作符重载。
mvs[i] =-mvs[i];
} } //***其中Vector3是结构体。可以在Unity Profiler中查看临时内存开销,可以看到GC数为0.也就是完全没有任何内存开销 } } }

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

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

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

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

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

用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- Demo分析的更多相关文章

  1. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新

    unity热更新是一个经久不衰的话题.除了最常见的lua之外,还有如JSBinding,C#等等.这里介绍一个使用ECMAScript4进行热更新的方案.它吸收了各家的优点,特色很鲜明. 项目地址: ...

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

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

  3. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用第三方组件

    Unity开发中,常常会用到一些第三方组件.本文以实例介绍如何在热更新脚本中使用这些第三方组件. 首先说明几个基本步骤: 第三方组件通常是以dll或者源码方式提供的,它们本身往往无法热更. 我们在脚本 ...

  4. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- CustomYieldInstruction 自定义中断指令

    ActionScript3脚本引擎为了方便热更新逻辑开发,提供的从脚本继承Unity类库功能在一些情况下可以提供开发的便利. 这次来建立一个示例,演示一下如何在脚本中自定义协程中断指令 Unity中的 ...

  5. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用FairyGUI (一)

    我们的热更新脚本在实际使用中,当然也要支持常用的第三方组件,例如这里介绍一个非常实用的第三方UI库:FairyGUI. 什么是FairyGUI 这里照搬FaiyGUI官网的介绍: 重新定义 UI 制作 ...

  6. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用FairyGUI (二)

    上次讲解了FairyGUI的最简单的热更新办法,并对其中一个Demo进行了修改并做成了热更新的方式. 这次我们来一个更加复杂一些的情况:Emoji. FairyGUI的   Example 04 - ...

  7. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 热更新Live2D

    live2D是一个很强大的2D动画组件.我们可以使用AS3脚本对它进行热更新. live2D在Unity中的使用请看这里: 如何获取Live2D 总得来说,我们可以先去live2D官网下载它的Unit ...

  8. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 在脚本中使用MonoBehaviour

    继上次分析了热更新的Demo后,这次来介绍如何在热更新代码中使用MonoBehaviour. MonoBehaviour挂载到GameObject对象上的脚本的基类.平常Unity开发时,简单的做法就 ...

  9. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 操作符重载和隐式类型转换

    C#中,某些类型会定义隐式类型转换和操作符重载.Unity中,有些对象也定义了隐式类型转换和操作符重载.典型情况有:UnityEngine.Object.UnityEngine.Object的销毁是调 ...

随机推荐

  1. 下一个ajax异步请求被挂起问题

    异步请求按理来说应该是会不受其它ajax请求影响的,但如果是服务端访问了Session就不能这么说了. 了解了asp.net的会话管理,那我们来看看今天要谈到的主题: IReadOnlySession ...

  2. Beta冲刺 第一天

    Beta冲刺 第一天 1. 昨天的困难 由于今天还是第一天,所以暂时没有昨天的困难. 2. 今天解决的进度 潘伟靖: 对代码进行了review 1.将某些硬编码改为软编码 2.合并了一些方法,简化代码 ...

  3. 201621123062《java程序设计》第六周作业总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图或相关笔记,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰 ...

  4. JAVA对象克隆

    1> 为了获取对象的一份拷贝,我们可以利用Object类的clone()方法. 2> 在派生类中覆盖基类的clone(),并声明为public.3> 在派生类的clone()方法中, ...

  5. [SDOI2014]旅行

    洛谷 P3313 [SDOI2014]旅行 https://www.luogu.org/problem/show?pid=3313 题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接 ...

  6. php函数var_dump() 、print_r()、echo()

    var_dump() 能打印出类型 print_r() 只能打出值 echo() 是正常输出... 需要精确调试的时候用 var_dump(); 一般查看的时候用 print_r() 另外 , ech ...

  7. JAVA_SE基础——40.super关键字

    只要this关键字掌握了,super关键字不在话下,因为他们原理都差不多的.. this&super 什么是this,this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针 ...

  8. 微信qq,新浪等第三方授权登录的理解

    偶们常说的第三方是指的微信,qq,新浪这些第三方,因为现在基本每个人都有qq或者微信,那么我们就可以通过这些第三方进行登录.而这些网站比如慕课网是通过第三方获取用户的基本信息 它会有个勾选按钮,提示是 ...

  9. thinkphp调试技巧

    调试的经验:很多时候程序调试不出来,但是又找不出错误,往往是拼写错误可能是很小的拼写错误,很难看出,或者多了一个空格,比如在配置路由的时候'URL_ROUTER_ON '=true,这样设置就会错误, ...

  10. eclipse怎么停止building workspace

    Eclipse 一直不停 building workspace完美解决总结 一.产生这个问题的原因多种 1.自动升级 2.未正确关闭 3.maven下载lib挂起 等.. 二.解决总结 (1).解决方 ...