警惕!Unity3D中UnityEngine.Object的一个小陷阱
先看看如下C#的脚本代码:
猜猜控制台打出来的是什么?
In the bool parameter function, value info is: True
肯定出乎很多人的意料吧?
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是否非空,这也符合输出的信息(也就是true)。好吧,不小心踏入了这个陷阱,而且编辑器在编辑阶段也不会有任何警告。那如果想正常调用应该如何做呢?只用这样:
TestFunction(transform as object);
因为System.object并没有重载类型转换运算符bool,输出如下(我把这个脚本挂在MainCamera下了):
In the Object parameter function, value info is: Main Camera (UnityEngine.Transform)
事情暂且告一段落,不过个人感觉确实是一个陷阱,诸位觉得如何呢?
最新文章
- JavaScript数组模拟栈和队列
- 近期C#项目中总结
- JavaEE PO VO BO DTO POJO DAO 整理总结
- AlwaysOn可用组基础知识
- windows远程桌面端口修改
- Asp.net MVC Bundle 的使用与扩展
- NDK(15)在ndk代码中注册和注销native函数
- phpstorm运行在浏览器中执行php文件报502错误
- 下拉框点链接js
- 常见的SQL字符串函数
- Duanxx的STM32学习:STM32下载方式选择
- nginx 报错502Bad Gateway
- 分布式作业 Elastic Job 如何动态调整?
- rosetta对称性文件(rosetta symmetry file)的产生及应用
- mysql数据库几种引擎
- 【Spring Boot&;&; Spring Cloud系列】单点登录SSO之OAuth2官方开发文档翻译
- ffmpeg的API函数用法 :sws_scale函数的用法-具体应用
- jQuery.extend()中的布尔值的作用
- Python学习笔记(四十一)— 内置模块(10)urllib
- 简单安装与配置mysql数据库(绿色版)