用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用第三方组件
Unity开发中,常常会用到一些第三方组件。本文以实例介绍如何在热更新脚本中使用这些第三方组件。
首先说明几个基本步骤:
- 第三方组件通常是以dll或者源码方式提供的,它们本身往往无法热更。
- 我们在脚本中使用第三方组件之前,需要将它们也导出一份可供脚本使用的API
- 这个步骤可以通过脚本工程提供的一个配置文件和批处理完成。
本文以DOTween为例,说明如何在工程中使用DOTween。
- 首先,先创建一个Unity工程,并且创建热更新工程。如果您不会创建,请参考这里:
- 去DOTween的官网下载Unity插件包。地址:http://dotween.demigiant.com/download.php
- 将DOTween拖入Unity工程。
- 将DOTween的API导出为ActionScript3的API。打开热更新工程的genapi.config.xml文件,将DOTween.dll加入到配置文件中:
<!--Configure DLLs to export--> <buildassemblys> <assembly value="C:\Program Files\Unity\Editor\Data\Mono\lib\mono\2.0\System.dll"></assembly> <assembly value="C:\Program Files\Unity\Editor\Data\Managed\UnityEngine.dll"></assembly> <assembly value="C:\Program Files\Unity\Editor\Data\UnityExtensions\Unity\GUISystem\UnityEngine.UI.dll"></assembly> <assembly value="E:/Unity/AS3Unity/AS3Hotfix\Library\ScriptAssemblies\Assembly-CSharp.dll"></assembly> <assembly value="E:\Unity\AS3Unity\AS3Hotfix\Assets\DOTween\DOTween.dll"></assembly> </buildassemblys>
- 执行CreateUnityAPI.bat,导出API代码。
- 打开热更新工程的Main.as,写入如下代码:
package { [Doc] /** * ... * @author */ public class Main { public function Main() { } public function update():void { } } } import dg.tweening.DOTween; import dg.tweening.Tween; import unityengine.Camera; import unityengine.GameObject; import unityengine.MonoBehaviour; import unityengine.Vector3; class doposition extends MonoBehaviour { var colorTween:Tween, emissionTween:Tween, offsetTween:Tween; private function Start() { var target:GameObject = GameObject.find("Cube"); //调用Double类型的缓动。 DOTween.to_( //属性获取器 function():Number{ return target.transform.position.z; } , //属性设置器 function(z:Number):void { target.transform.position = new Vector3(0, 0, z); } , //移动到10 10 , //在3秒内移动到位 3 ); } } Camera.main.gameObject.addComponent(doposition);
- 点击编译后,在Unity中可看到效果:立方体在3秒内移动到了0,0,10的位置。
最后有些地方需要说明:DoTween这个项目使用了大量的扩展方法。但是ActionScript3脚本是不能直接支持扩展方法的。但是我们可以使用原型链扩展使得扩展方法看起来可以被调用。
另外,DoTween的扩展方法中使用了大量泛型方法定义。由于需要热更新的平台无法动态创建类型(例如IOS),因此泛型方法定义不能直接在脚本中使用。我们必须在主工程中写一些工具方法作为桥梁。