当前位置: 首页 > 编程日记 > 正文

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

原型链是JS的必备,作为ECMAScript4,原型链也是支持的。

特别说明,ActionScript3是支持完整的面向对象继承支持的,原型链只在某些非常特殊的情况下使用。

本文旨在介绍如何使用原型链。

任意对象类型都有一个prototype属性,包括导入的Unity的API也有。我们可以和JS一样的对这个prototype进行操作,比如动态的添加成员,添加方法等。

  1. 如果您决定使用原型链,那么必须舍弃编译时类型检查。如果使用强类型,则编译器会认为动态添加的成员不存在,而提示编译错误。解决办法为去掉变量的类型说明,或者将变量强制转换成Object。
  2. 和JS引擎一样,原型链必须在运行时顺着prototype链查找。因此会影响性能。

本文说明,如何在脚本中,动态监听 EventTrigger。我们将这篇文章中介绍的使用不可热更的C#代码做的监听,改写为ActionScript3实现。

工程说明

  1. 新建一个Untiy工程,并且创建AS3热更新项目。如果不会创建,请参考这里
  2. 在HotFixDemoScene1上添加一个Image。
  3. 本次代码需要使用 RectTransformUtility 这个类。如果是Unity2017.2版本以后,由于这个类型被分拆到了其他dll (UnityEngine.UIModule.dll),因此需要将它加入到配置表里。
  4. 打开热更新工程的genapi.config.xml ,将如下配置加入配置节中:
    <!--Configure DLLs to export--><buildassemblys><assembly value="D:\Program Files\Unity\Editor\Data\Mono\lib\mono\2.0\System.dll"></assembly><assembly value="D:\Program Files\Unity\Editor\Data\Managed\UnityEngine\UnityEngine.CoreModule.dll"></assembly><assembly value="D:\Program Files\Unity\Editor\Data\Managed\UnityEngine\UnityEngine.UIModule.dll"></assembly><assembly value="D:\Program Files\Unity\Editor\Data\UnityExtensions\Unity\GUISystem\UnityEngine.UI.dll"></assembly><assembly value="F:/ASTool_UnityTest/HotFix_EventTrigger\Library\ScriptAssemblies\Assembly-CSharp.dll"></assembly></buildassemblys>
  5. 打开热更新项目的Main.as文件,将内容改为如下代码:
    package
    {[Doc]/*** ...* @author */public class Main{public function Main() {    }public function update():void{    }}}
    import as3runtime.RefOutStore;
    import system.collections.generic.List_Of_EventTrigger_Entry;
    import unityengine.GameObject;
    import unityengine.MonoBehaviour;
    import unityengine.RectTransform;
    import unityengine.RectTransformUtility;
    import unityengine.Vector3;
    import unityengine.events.UnityAction_Of_BaseEventData;
    import unityengine.eventsystems.BaseEventData;
    import unityengine.eventsystems.EventTrigger;
    import unityengine.eventsystems.EventTriggerType;
    import unityengine.eventsystems.EventTrigger_Entry;
    import unityengine.eventsystems.PointerEventData;class UGUIEventTriggerTool
    {/*** 静态方法。检查某个GameObject上是否包含EventTrigger组件。如果有则返回它,否则创建一个并返回。* @param    go 输入的GameObject* @return  返回EventTrigger*/public static function Get(go:GameObject):EventTrigger {  var trigger:EventTrigger = go.getComponent(EventTrigger) as EventTrigger;  if (null == trigger){  trigger = EventTrigger(go.addComponent(EventTrigger));  }  return trigger;  }  
    }/* **  在EventTrigger的原型链上定义AddEventListener方法。*  EventTrigger类型没有公开构造函数,因此API导出时,不会为他创建在脚本中继承的接口。*  这里我们可以用原型链来对它进行扩展。*  包外代码只会执行一次。所以只会在原型链上定义一次AddEventListener方法。* */
    EventTrigger.prototype.AddEventListener =    function (eventTriggerType:EventTriggerType,  action:UnityAction_Of_BaseEventData):void{/*** EventTrigger有一个嵌套内部类 UnityEngine.EventSystems.EventTrigger.Entry。* 由于ActionScript3并不支持嵌套类,因此它被导出成为EventTrigger_Entry。*/        var entry:EventTrigger_Entry = new EventTrigger_Entry();  entry.eventID = eventTriggerType;  entry.callback.addListener(action);  this.triggers.add(entry);}  /*** 扩展MonoBehaviour,让Image组件可以被拖拽。*/
    class UGUIEventTriggerTest extends MonoBehaviour
    {function Start(){/*** 此处使用 * 类型来代表任意类型。* 这样即可跳过编译时类型检查,使用原型链。* 否则将会提示编译错误。*/var t:* = UGUIEventTriggerTool.Get(gameObject);/*** 调用在原型链上定义的方法,给Drag事件添加处理函数。*  我们可以直接使用匿名函数来作为处理函数。*/t.AddEventListener(EventTriggerType.Drag, function (baseData:BaseEventData):void{var data:PointerEventData = baseData as PointerEventData;var rt:RectTransform = data.pointerPress.getComponent(RectTransform) as RectTransform;var globalMousePos:Vector3;/*** RectTransformUtility.screenPointToWorldPointInRectangle的参数* worldPoint : (Out)UnityEngine.Vector3* 是一个Ref Out参数。ActionScript3是没有ref和out关键字的,* 因此这里使用RefOutStore来接收返回的参数。*/var store:RefOutStore = new RefOutStore();                    if (RectTransformUtility.screenPointToWorldPointInRectangle(rt, data.position, data.pressEventCamera, globalMousePos,store)){//传入形参名,来提取值。globalMousePos = store.getValue("worldPoint") as Vector3;rt.position = globalMousePos;}});}}
    //将脚本挂载到Image上。
    GameObject.find("Image").addComponent(UGUIEventTriggerTest);
  6. 点击编译,然后在Unity中点击播放。我们现在即可拖动这个Image。


转载于:https://www.cnblogs.com/ashei/p/8885175.html

相关文章:

教育部发文35所高校新增AI本科专业!想回去重新高考

点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」7折优惠最后3天&#xff0c;请扫码咨询 ↑↑↑作者 | 琥珀出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;2019 年 3 月 28 日&#xff0c;教育部公布了 2018 年度普通高等学校本科专业备案和审批结果。消息一出&…

莱芜市公安局交警支队智能交通项目集成及容灾公开招标公告

莱芜市公安局交警支队智能交通建设项目公开招标公告 时间:2011-7-5 点击:249莱芜市公安局交警支队智能交通建设项目公开招标公告一、招标人名称&#xff1a;莱芜市公安局交警支队 联系方式&#xff1a;0634-5667998&#xff08;吕老师&#xff09;二、招标代理机构名称&#x…

【Go】Go基础(十):文件读写

一、读写数据 1、读取用户的输入 使用fmt 包提供的 Scan 和 Sscan 开头的函数&#xff1b; * Scanln 扫描来自标准输入的文本&#xff0c;将空格分隔的值依次存放到后续的参数内&#xff0c;直到碰到换行。 * Scanf 与其类似&#xff0c;除了 Scanf 的第一个参数用作格式字符…

怎样能拿到第一份编程工作?这里告诉你答案 | 码书

“写代码时&#xff0c;每次都要告诉自己&#xff1a;最后负责维护代码的&#xff0c;会是一个知道你住在哪的变态暴力狂。” ——约翰伍德&#xff08;John Woods&#xff09;拿下第一份编程工作需要付出更多努力&#xff0c;但是如果采纳下面的建议&#xff0c;应该不会有太大…

JSON知识点

JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集&#xff0c;采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读…

asp常用函数(备忘)

1.数组长度&#xff1a; <% Dim grade,i gradesplit("1,2,5,10,20,50,100,200,500,1000",",") for i0 to ubound(grade) response.write grade(i)&"\n" next %> 2.获得插入的id set rs server.createobject(&q…

【leetcode】力扣刷题(1):两数之和(Go、Python)

一、问题描述 给定一个整数数组 nums 和一个目标值 target&#xff0c;请你在该数组中找出和为目标值的那 两个 整数&#xff0c;并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;你不能重复利用这个数组中同样的元素。 示例: 给定 nums [2, 7,…

轻松练:如何从900万张图片中对600类照片进行分类|技术头条

点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」7折优惠最后2天&#xff0c;请扫码咨询 ↑↑↑作者 | Aleksey Bilogur译者 | 风车云马责编 | Jane出品 | AI科技大本营&#xff08;公众号id:rgznai100&#xff09;【导语】完成一个简单的端到端的机器学习模型需要几步&…

介绍两个好玩的和Github相关的Chrome扩展

1. Octotree 默认的github网页里的代码显示没有我们在IDE里看到的直观&#xff0c;即代码文件所在的文件夹无法以树形层级结构显示在屏幕左边。 安装Octotree之后&#xff1a; 方便多了。 2. Isometric Contributions github commit的统计页面比较平淡&#xff1a; 安装了Isome…

Schema约束模式实例

book.xsd <?xml version"1.0" encoding"UTF-8"?> <!-- xmlns:默认命名空间 xmlns:xs:当前的文档的标记来自http://www.w3.org/2001/XMLSchema命名空间 前缀:xs elementFormDefault&#xff1a;当前文档使用的标记必须是使用http://www.w3.…

【leetcode】力扣刷题(2):两数相加(go语言)

一、问题描述 给出两个 非空 的链表用来表示两个非负的整数。其中&#xff0c;它们各自的位数是按照 逆序 的方式存储的&#xff0c;并且它们的每个节点只能存储 一位 数字。 如果&#xff0c;我们将这两个数相加起来&#xff0c;则会返回一个新的链表来表示它们的和。 您可…

“GANs之父”Ian Goodfellow被爆已从Google离职

点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」7折优惠最后2天&#xff0c;请扫码咨询 ↑↑↑整理 | 一一出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;3 月 28 日&#xff0c;深度学习大牛李沐在知乎爆料称&#xff0c;他从某机器学习大佬处获悉&#xff0c…

Gulp快速入门教程

Gulp是基于流的前端自动化的构建工具&#xff0c;虽说如今是webpack盛行的时代&#xff0c;但是gulp和webpack整合效果更美味的&#xff0c;鱼与熊掌都可兼得哦&#xff01;本文只介绍下Gulp的基本使用和一些常用的Gulp插件&#xff0c;废话不多说&#xff0c;一起来看看吧。 g…

linux 防火墙 命令

-- 永久设置防火墙&#xff08;重启不恢复&#xff09; 开启&#xff1a;chkconfig iptables on 关闭&#xff1a;chkconfig iptables off-- 暂时设置防火墙&#xff08;重启后恢复&#xff09; 开启&#xff1a;service iptables start 关闭&#xff1a;service i…

如何将TensorFlow Serving的性能提高超过70%?

点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」7折优惠最后2天&#xff0c;请扫码咨询 ↑↑↑译者 | Major出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;TensorFlow已经发展成为事实上的ML(机器学习)平台&#xff0c;在业界和研究领域都很流行。对TensorFlow…

【leetcode】力扣刷题(3):无重复字符的最长子串(go语言)

一、问题描述 给定一个字符串&#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”&#xff0c;所以其长度为 3。 示例 2: 输入: “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是…

单点登录与权限管理本质:session和cookie介绍

本篇开始写「单点登录与权限管理」系列的第一部分&#xff1a;单点登录与权限管理本质&#xff0c;这部分主要介绍相关的知识概念、抽象的处理过程、常见的实现框架。通过这部分的介绍&#xff0c;能够对单点登录与权限管理有整体上的了解&#xff0c;对其相关概念、处理流程、…

【.Net MF网络开发板研究-04】Socket编程之服务端

前几篇文章介绍了Http相关的应用&#xff0c;其实从技术角度而言&#xff0c;应该先介绍Socket编程&#xff0c;然后再介绍Http&#xff0c;毕竟Http是用Socket相关函数编程实现的。 .NET Micro Framework的Socket函数和桌面版.NET Framework中的函数完全兼容&#xff0c;换句话…

【Qt】Qt中调用python接口

在Qt程序中调用python函数从步骤 1、在pro中添加python的头文件路径和库 INCLUDEPATH += /usr/include/python3.4 LIBS += -L /usr/lib/python3.4/config-3.4m-x86_64-linux-gnu -lpython3.42、添加python头文件 #undef slots #include <python3.4/Python.h> #define …

优雅的理解 call 和 apply 的使用方法

作者在看到一篇优雅的使用 js 的各种方法解决算法的时候产生的疑问&#xff0c;到底什么时候使用 apply 和 call 啦&#xff1f; 每次看到别人用 apply 和 call 其实从以前的懵懵懂懂到现在的明白&#xff0c;但是自己从来未下手去用过&#xff0c;最近比较闲。开始打一下 Jav…

何恺明等人提TensorMask框架:比肩Mask R-CNN,4D张量预测新突破

整理 | 刘畅、Jane 责编 | Jane 出品 | AI科技大本营&#xff08;id&#xff1a;rgznai100) 看到今天要给大家介绍的论文&#xff0c;也许现在大家已经非常熟悉 Ross Girshic、Piotr Dollr 还有我们的大神何恺明的三人组了。没错&#xff0c;今天这篇重磅新作还是他们的产出&am…

init.rc的disabled含义

http://www.kandroid.org/android_pdk/bring_up.htmlhttp://androidnote.com/Article_show.asp?ArticleID649如果该服务选项中没有disabled定义&#xff0c;则在init.rc中解析到这个服务的时候&#xff0c;会马上执行这个服务。而如果在服务的选项中增加了disabled定义&#x…

【Qt】在ubuntu14.04上安装Qt5.12(失败)

注意 在ubuntu14.04上安装Qt5.12最终失败了,Qt5.12需要的libdbus库的版本和ubuntu14.04中的不一致,如果强行升级libdbus库版本,会导致系统桌面无法启动。 再次提示:不要按照下述步骤操作,它只是一个记录失败操作的笔记。 如果有大神安装成功了,还请不吝赐教。 1、安装Q…

80+机器学习数据集,还不快收藏

整理 | suiling 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 对于从事机器学习的小伙伴来说&#xff0c;机器学习必须以大量的数据为基础&#xff0c;否则构建再好的模型也不能达到你想要的效果。同时&#xff0c;不同质量的数据集也会影响到模型训练的效果。之…

SpringBoot+Docker+Git+Jenkins实现简易的持续集成和持续部署

前言 本篇文章引导你使用Jenkins部署[SpringBoot项目],同时使用Docker和Git实现简单的持续集成和持续部署。&#xff08;项目地址&#xff1a;sso-merryyou&#xff09; 流程图如下&#xff1a; push代码到Github触发WebHook。&#xff08;因网络原因&#xff0c;本篇使用gitee…

LINUX下用C语言历遍目录 C语言列出目录

&#xff08;被考了一题遍历目录&#xff0c;连需要的系统库函数我都不知道...打击中...&#xff09;小羽给了一个答案&#xff1a;#include<stdio.h> #include<dirent.h>int main(int argc,char **argv) { DIR *p; struct dirent *dirp; if (argc ! 2) …

【linux】ubuntu14.04升级dbus到1.13.8,杯具了,无法进入桌面

一、问题描述 在ubuntu14.04中安装了Qt5.12&#xff0c;启动QtCreator报错&#xff0c;需要高版本的dbus。 将dbus升级到1.13.8后&#xff0c;杯具了&#xff0c;无法进入桌面 二、尝试解决 1、尝试恢复之前的版本&#xff08;失败&#xff09; 进入终端界面&#xff1a;Ct…

线下教育地位遭冲击?“AI+教育”公司同台讲了这些事实

点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」7折优惠最后1天&#xff0c;请扫码咨询 ↑↑↑整理 | 一一出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;近日&#xff0c;网易新闻、网易有道、清华大学数据科学研究院在清华大学举办了“中国AI创新者论坛”。当…

mysql查看正在执行的sql语句

有2个方法&#xff1a; 1、使用processlist&#xff0c;但是有个弊端&#xff0c;就是只能查看正在执行的sql语句&#xff0c;对应历史记录&#xff0c;查看不到。好处是不用设置&#xff0c;不会保存。 -- use information_schema; -- show processlist; 或者&#xff1a; -- …

poj2472

最短路&#xff0c;bellman View Code #include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>using namespace std;#define inf 0x3f3f3f3f#define maxn 100#define maxm 10000#define eps 10e-9int n, m…