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);
如此我们就了解了脚本提供的操作符重载功能.
来源: https://www.cnblogs.com/ashei/p/8892778.html