博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 操作符重载和隐式类型转换
阅读量:7155 次
发布时间:2019-06-29

本文共 2675 字,大约阅读时间需要 8 分钟。

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;//新建一个GameObjectvar obj:GameObject = new GameObject("test");if( obj != null){    trace("打印obj");    trace("obj:", obj);}//销毁GameObjectUObject.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 );//这是不正确的乘法,脚本系统将返回NaNvar f = v4 * m4;trace( f);

 

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

 

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

你可能感兴趣的文章
USMT
查看>>
数据处理中白化Whitening的作用图解分析
查看>>
HDFS API编程
查看>>
【CF】328 D. Super M
查看>>
Nodejs Guides(二)
查看>>
EL表达式
查看>>
本地计算机 上的 MySQL 服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止。...
查看>>
调用系统拍照
查看>>
Java——IO之常量及路径
查看>>
NSUserDefaults保存应用中的数据
查看>>
用Gvim建立IDE编程环境 (Windows篇)_Nothing is impossible for a willing heart._百度空间...
查看>>
poj 1386 Play on Words
查看>>
到了最后出现败笔
查看>>
Chrome 插件
查看>>
《Effective C#》读书笔记——条目24:用委托实现回调<使用C#表达设计>
查看>>
c++的重载,覆盖与隐藏
查看>>
How to make a combo box with fulltext search autocomplete support?
查看>>
大数据的三个入口
查看>>
void指针
查看>>
基本类型赋值转换规则表
查看>>