警惕!Unity3D中UnityEngine.Object的一个小陷阱

先看看如下C#的脚本代码:

警惕!Unity3D中UnityEngine.Object的一个小陷阱

猜猜控制台打出来的是什么?

In the bool parameter function, value info is:  True

肯定出乎很多人的意料吧?警惕!Unity3D中UnityEngine.Object的一个小陷阱

transform的类型跟bool类型一点关系都没有,怎么会调用TestFunction(bool value)呢?我碰到这个问题的时候,第一反应是编译器出问题了,后来同事的机器上一样有同样的运行结果。于是我继续写了如下代码:

警惕!Unity3D中UnityEngine.Object的一个小陷阱

这次的运行结果符合预期了,调用的是void TestFunction(System.Object value):

In the Object parameter function, value info is:  MyClass

那么问题还是出现在Unity3D的类,也就是Transform上,那就挨个看它的父类,最上面就是UnityEngine.Object。接着看了下UnityEngine.Object的metaData文件,才恍然大悟:

警惕!Unity3D中UnityEngine.Object的一个小陷阱

unity3d的Object类重载了类型隐式转换运算符bool(其他类型转换一样可以被重载,不仅仅是bool),所以TestFunction(transform) 实际上调用的是这个函数,这个重载函数的作用是判断当前Object是否非空,这也符合输出的信息(也就是true)。好吧,不小心踏入了这个陷阱,而且编辑器在编辑阶段也不会有任何警告。那如果想正常调用应该如何做呢?只用这样:

TestFunction(transform as object);

因为System.object并没有重载类型转换运算符bool,输出如下(我把这个脚本挂在MainCamera下了):

In the Object parameter function, value info is:  Main Camera (UnityEngine.Transform)

事情暂且告一段落,不过个人感觉确实是一个陷阱警惕!Unity3D中UnityEngine.Object的一个小陷阱,诸位觉得如何呢?

上一篇:vueHistory 模式下,布置到服务器上路由刷新会报nginx404错误


下一篇:SQL优化技术分析-1:操作符优化