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

Unity开发中,常常会用到一些第三方组件。本文以实例介绍如何在热更新脚本中使用这些第三方组件。

首先说明几个基本步骤:

  1. 第三方组件通常是以dll或者源码方式提供的,它们本身往往无法热更。
  2. 我们在脚本中使用第三方组件之前,需要将它们也导出一份可供脚本使用的API
  3. 这个步骤可以通过脚本工程提供的一个配置文件和批处理完成。

本文以DOTween为例,说明如何在工程中使用DOTween。

  1. 首先,先创建一个Unity工程,并且创建热更新工程。如果您不会创建,请参考这里:
  2. 去DOTween的官网下载Unity插件包。地址:http://dotween.demigiant.com/download.php
  3. 将DOTween拖入Unity工程。
  1. 将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>
  1. 执行CreateUnityAPI.bat,导出API代码。
  2. 打开热更新工程的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);
  1. 点击编译后,在Unity中可看到效果:立方体在3秒内移动到了0,0,10的位置。

 最后有些地方需要说明:DoTween这个项目使用了大量的扩展方法。但是ActionScript3脚本是不能直接支持扩展方法的。但是我们可以使用原型链扩展使得扩展方法看起来可以被调用。

另外,DoTween的扩展方法中使用了大量泛型方法定义。由于需要热更新的平台无法动态创建类型(例如IOS),因此泛型方法定义不能直接在脚本中使用。我们必须在主工程中写一些工具方法作为桥梁。

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java技术栈

Java 中的伪共享详解及解决方案

1163
来自专栏生信宝典

Linux学习-文件列太多,很难识别想要的信息在哪列;别焦急,看这里。

经常会碰到列数特别多的文件,而屏幕又不足以放下这么多列;即便能放下,也不容易清晰的辨别出想提取的信息在第几列。 根据我们前面的学习,可以用一行命令或简单的写一...

28010
来自专栏同步博客

Memcache存储机制与指令汇总

  memcached是高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。

882
来自专栏Python、Flask、Django

python中用requests获取API参数

2096
来自专栏PHP实战技术

Linux下自动化监控内存、存储空间!

距离上一次更新文章已经过去一段时间了,小编在这段时间因为一些琐事,加上身体生病不能及时更新文章,今天身体逐渐恢复就急忙来更新文章,今天思梦给大家...

3486
来自专栏点滴积累

Jupyter(Python)中无法使用Cache原理分析

前言 最近需要在Jupyter中写一个类库,其中有一个文件实现从数据库中读取空间数据并加载为Feature对象,Feature对象是cartopy封装的geom...

3446
来自专栏运维小白

1-3 CCNA

IP地址 是逻辑地址 用来确定一个网络中的一个节点,或者一个设备 两台主机通信,必须要有IP地址,32位二进制数,为了便于记忆,转换成10进制数,如 192....

35515
来自专栏信安之路

一个病毒样本分析的全过程

SHA1: 3f738735bb0c5c95792c21d618eca8c0d5624717

1740
来自专栏H2Cloud

C++ 多线程编程总结

C++ 多线程编程总结          在开发C++程序时,一般在吞吐量、并发、实时性上有较高的要求。设计C++程序时,总结起来可以从如下几点提高效率: l ...

3776
来自专栏张善友的专栏

.net 2.0 你是如何使用事务处理?

     事务处理作为企业级开发必备的基础设施, .net 2.0通过System.Transactions对事务提供强大的支持.你还是在使用.net 1.x下...

2196

扫码关注云+社区

领取腾讯云代金券