查看: 1410|回复: 0
打印 上一主题 下一主题

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

[复制链接]

435

主题

2

听众

6371

积分

高级设计师

Rank: 6Rank: 6

纳金币
6372
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2012-9-3 11:06:48 |只看该作者 |倒序浏览
先看看如下C#的脚本代码:





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

In the bool parameter function, value info is:  ***e




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




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

In the Object parameter function, value info is:  MyClass




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






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


因为System.object并没有重载类型转换运算符bool,输出如下(我把这个脚本挂在MainCamera下了):
In the Object parameter function, value info is:  Main Camera (UnityEngine.Transform)




事情暂且告一段落,不过个人感觉确实是一个陷阱,诸位觉得如何呢?









分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-15 11:39 , Processed in 0.111305 second(s), 28 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部