zoukankan      html  css  js  c++  java
  • 警惕!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)

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

  • 相关阅读:
    org.hibernate.NonUniqueObjectException 原因及解决办法
    Hibernate方法save、update、merge、saveOrUpdate及get和load的区别
    Hibernate实体对象的生命周期(三种状态)
    Java I/O 全面详解
    故障检测、性能调优与Java类加载机制
    Linux基本命令+Makefile
    Redhat9.0+Apache1.3.29+Mysql3.23.58+PHP4.3.4
    u盘安装Linux系统详细教程
    Linux下软件常见安装方式
    Spring MVC 小计
  • 原文地址:https://www.cnblogs.com/suway/p/7384412.html
Copyright © 2011-2022 走看看