用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 操作符重载和隐式类型转换
2018-04-23 10:48
639 查看
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的热更新 -- 使用FairyGUI (一)
- 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用FairyGUI (二)
- 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 热更新Live2D
- 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用第三方组件
- c#实现隐式的用户自定义类型转换(关键字implicit operator)
- C++库研究笔记——操作符重载实现类型转换&这样做的意义
- C#中的不同类型之间的显式与隐式转换实现
- C++ 用operator实现隐式类型转换
- 利用operator实现隐式类型转换的简单应用
- 用隐式转换实现类型或结构体直接赋值
- C++库研究笔记——操作符重载实现类型转换&这样做的意义
- c++ operator操作符的两种用法:重载和隐式类型转换,string转其他基本数据类型的简洁实现string_cast
- .net类型自定义隐式(显式)转换操作的位置问题
- PL/SQL中的数据类型隐式转换规则
- atoi,atol,strtod,strtol,strtoul实现类型转换
- 【java基础】在Java中实现基本数据类型与字符、字符串之间的转换
- SpringBoot整合Mybatis实现自动转换枚举类型
- c++中类型转换积累(持续更新)
- 二、Struts 2的类型转换---1.Struts 2中实现自定义的类型转换