用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);

 如此我们就了解了脚本提供的操作符重载功能。

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏jojo的技术小屋

原 四、变量、作用域和内存问题

作者:汪娇娇 时间:2017年11月5日 一、基本类型和引用类型的值 基本类型指的是简单的数据段,引用类型指那些可能由多个值构成的对象。 基本类型的值保存在变量...

28980
来自专栏烙馅饼喽的技术分享

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

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

413100
来自专栏烙馅饼喽的技术分享

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

unity热更新是一个经久不衰的话题。除了最常见的lua之外,还有如JSBinding,C#等等。这里介绍一个使用ECMAScript4进行热更新的方案。它吸收...

29540
来自专栏烙馅饼喽的技术分享

用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- Demo分析

如何创建工程 下载最新的Unity发布插件包。 打开Unity,新建一个项目 将插件包导入 ? 在菜单中点击ASRuntime/Create ActionScr...

372100
来自专栏jojo的技术小屋

原 三、基本概念

作者:汪娇娇 时间:2017年11月4日 一、语法 1、区分大小写 2、标识符 指变量、函数、属性的名字,采用驼峰大小写格式。 3、注释 单行:// 多行:/*...

27050
来自专栏jojo的技术小屋

原 一、JavaScript简介

作者:汪娇娇 时间:2017年11月4日 一、组成部分 ? JavaScript由三部分内容组成: (1)ECMAScript(核心) (2)DOM(文档对象模...

31180
来自专栏腾讯NEXT学位

深入理解 ES6 模块机制

35160
来自专栏烙馅饼喽的技术分享

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

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

37590
来自专栏烙馅饼喽的技术分享

记一个脚本解释器的开发

最近可以有1个月左右的空闲,可以稍微整理一下这个脚本解释器的开发过程。 一、缘由   2014年左右,我们使用AIR技术,开发了一个3D战争类型的手游。那时候手...

49370

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励