用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 操作符重载和隐式类型转换
C#中,某些类型会定义隐式类型转换和操作符重载。Unity中,有些对象也定义了隐式类型转换和操作符重载。典型情况有:UnityEngine.Object。UnityEngine.Object的销毁是调用 Destory。被调用过Destory的对象,并不是真的变成null了,但是再对它操作会导致异常。
Unity重载了UnityEngine.Object "==","!="操作符,和 implicit 转换。
- public static bool operator ==(Object x, Object y);
- public static bool operator !=(Object x, Object y);
- public static implicit operator bool(Object exists);
因此,在Unity中,判断某个GameObject是否被Destory掉了的判断方法是,判断它是否==null,或者直接用它做if的判断条件。
脚本系统中的操作符重载和隐式类型转换
热更脚本系统为了支持Unity的这些特性,也增加了操作符重载。打开上次的项目,我们对代码作一些修改,可以看到脚本中大部分操作符重载同样可行。
- package
- {
- [Doc]
- /**
- * ...
- * @author
- */
- public class Main
- {
- public function Main()
- {
- }
- public function update():void
- {
- }
- }
- }
- import unityengine.GameObject;
- import unityengine.UObject;
- //新建一个GameObject
- var obj:GameObject = new GameObject("test");
- if( obj != null)
- {
- trace("打印obj");
- trace("obj:", obj);
- }
- //销毁GameObject
- UObject.destroyImmediate_(obj);
- if(!obj) //隐式类型转换生效。
- {
- trace("隐式类型转换,obj转为bool,由于obj已被销毁,所以为false");
- trace("obj:", obj);
- }
- if( obj === null )
- {
- trace("obj is null");
- }
- else
- {
- trace("严格相等比较:obj 不为 null");
- trace("obj not null");
- }
执行结果如下:
然后我们再来测试其他操作符重载:
Unity中,向量和矩阵有操作符重载。现在我们把脚本修改成如下代码:
- package
- {
- [Doc]
- /**
- * ...
- * @author
- */
- public class Main
- {
- public function Main()
- {
- }
- public function update():void
- {
- }
- }
- }
- import unityengine.Matrix4x4;
- import unityengine.Vector3;
- import unityengine.Vector4;
- var v:Vector3 = new Vector3(4, 5, 6);
- //Vector3的加减乘除
- trace( v,"+ Vector3.one =", v + Vector3.one);
- trace( v, "- Vector3.one =", v - Vector3.one);
- trace( v, "* 5 =", v * 5 );
- trace( v, "/ 5 =", v / 5 );
- //定义一个4x4矩阵
- var m4:Matrix4x4 = Matrix4x4.scale( Vector3.one * 2 );
- trace(m4);
- //演示矩阵和Vector3相乘。
- var v4:Vector4 = new Vector4( v.x, v.y, v.z, 1 );
- trace( "m4 * v4 = ", m4 * v4 );
执行结果如下:
当您使用了错误的操作符重载时,如果编译期能够检查,则编译器会提示错误。
例如, Matrix4x4和Vector4直接相乘,必须是矩阵X向量。所以,如下代码会导致编译错误:
- import unityengine.Matrix4x4;
- import unityengine.Vector3;
- import unityengine.Vector4;
- var v:Vector3 = new Vector3(4, 5, 6);
- //定义一个4x4矩阵
- var m4:Matrix4x4 = Matrix4x4.scale( Vector3.one * 2 );
- trace(m4);
- //演示矩阵和Vector3相乘。
- var v4:Vector4 = new Vector4( v.x, v.y, v.z, 1 );
- var f = v4 * m4;
编译器报错:
如果您选择隐藏变量类型,则编译可以通过,但是这样,不会获得预期的执行效果。
- import unityengine.Matrix4x4;
- import unityengine.Vector3;
- import unityengine.Vector4;
- var v:Vector3 = new Vector3(4, 5, 6);
- var m4:* = Matrix4x4.scale( Vector3.one * 2 );
- trace(m4);
- var v4:* = new Vector4( v.x, v.y, v.z, 1 );
- //这是不正确的乘法,脚本系统将返回NaN
- var f = v4 * m4;
- trace( f);
如此我们就了解了脚本提供的操作符重载功能。
用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 操作符重载和隐式类型转换的更多相关文章
- 用ECMAScript4 ( ActionScript3) 实现Unity的热更新
unity热更新是一个经久不衰的话题.除了最常见的lua之外,还有如JSBinding,C#等等.这里介绍一个使用ECMAScript4进行热更新的方案.它吸收了各家的优点,特色很鲜明. 项目地址: ...
- 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用原型链和EventTrigger
原型链是JS的必备,作为ECMAScript4,原型链也是支持的. 特别说明,ActionScript3是支持完整的面向对象继承支持的,原型链只在某些非常特殊的情况下使用. 本文旨在介绍如何使用原型链 ...
- 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- Demo分析
如何创建工程 下载最新的Unity发布插件包. 打开Unity,新建一个项目 将插件包导入 在菜单中点击ASRuntime/Create ActionScript3 FlashDevelop HotF ...
- 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用第三方组件
Unity开发中,常常会用到一些第三方组件.本文以实例介绍如何在热更新脚本中使用这些第三方组件. 首先说明几个基本步骤: 第三方组件通常是以dll或者源码方式提供的,它们本身往往无法热更. 我们在脚本 ...
- 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- CustomYieldInstruction 自定义中断指令
ActionScript3脚本引擎为了方便热更新逻辑开发,提供的从脚本继承Unity类库功能在一些情况下可以提供开发的便利. 这次来建立一个示例,演示一下如何在脚本中自定义协程中断指令 Unity中的 ...
- 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用FairyGUI (一)
我们的热更新脚本在实际使用中,当然也要支持常用的第三方组件,例如这里介绍一个非常实用的第三方UI库:FairyGUI. 什么是FairyGUI 这里照搬FaiyGUI官网的介绍: 重新定义 UI 制作 ...
- 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用FairyGUI (二)
上次讲解了FairyGUI的最简单的热更新办法,并对其中一个Demo进行了修改并做成了热更新的方式. 这次我们来一个更加复杂一些的情况:Emoji. FairyGUI的 Example 04 - ...
- 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 热更新Live2D
live2D是一个很强大的2D动画组件.我们可以使用AS3脚本对它进行热更新. live2D在Unity中的使用请看这里: 如何获取Live2D 总得来说,我们可以先去live2D官网下载它的Unit ...
- 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 在脚本中使用MonoBehaviour
继上次分析了热更新的Demo后,这次来介绍如何在热更新代码中使用MonoBehaviour. MonoBehaviour挂载到GameObject对象上的脚本的基类.平常Unity开发时,简单的做法就 ...
随机推荐
- Linux基础常用命令
Linux 下命令有很多,并且很多命令用法又有不同的选项,这里介绍一些常用的最基本的Linux命令的用法,希望给大家留下便利之处. 1.cd 切换目录.例如 cd /home 可切换到home目录, ...
- Python之旅.第二章数据类型 3.19/3.20/3.21/3.22/3.23
一.数字类型 1.int类型: 基本使用: 用途:用于年龄,手机号,身份证号: 定义: age=18: 常用操作+内置方法: 正常的运算赋值: 进制转换: print(bin(3)); 把十进制3转换 ...
- Jenkins+maven+git配置
1) 安装maven 如下图我已装好maven(这是我很早以前装的,安装教程大家可以百度一下,很容易安装的) 2) 安装git客户端 如下图所示,我也安装好了git客户 ...
- 使用 slf4j抽象日志层 和 其他日志实现对接
前言 如果你正在提供一个开源的Java-jar,那么让你的项目仅依赖slf4j-api然后让你的用户在他们开发和运营环境中选择任意的日志实现绝对是个好想法,.作为终端用户,他们可以快速地从上面提到的日 ...
- 关于阿里巴巴iconfont的使用方法
iconfont网址:http://www.iconfont.cn/ 说起iconfont,做前端开发的应该知道它的好处,图标库之丰富,只有你想不到的,没有你找不到的,而且轻量高清.用户在iconfo ...
- Django Form组件 学生管理系统
from django.db import models # Create your models here. class Classes(models.Model): title=models.Ch ...
- requests post一个json数据
# post一个json数据 import requests headers={ "Accept":"application/json, text/plain, */*& ...
- cookielib和urllib2模块结合模拟网站登录
1.cookielib模块 cookielib模块的主要作用就是提供可存储cookie的对象,以便于与urllib2模块配合使用来访问internet资源,例如可以利用本模块的cookiejar类的对 ...
- 树莓派(1)- Raspberry Pi 3B 安装系统并联网
一.背景 昨天到手淘宝买的3B,既然买了就不能让它吃灰,动起来. 二.物料 名称 说明 硬件 树莓派3B 主体 树莓派电源 5V 2A sd卡 4G低速(推荐是16G class10),我手头只有这 ...
- 学习React系列(七)——Fragments、Portals、Error Boundaries与WEB组件
React.Fragment portals Error Boundaries WEB组件 React.Fragment 想象一个场景,想把td包装为组件添加到table中去,代码如下: class ...