Unity3d中UnityEngine.Object的几个注意点

本文探讨了UnityEngine.Object类在Unity中的使用,并重点讨论了该类重载的运算符可能导致的意外行为。通过实例展示了如何避免类型隐式转换引发的问题。

UnityEngine.Object继承自system.Object,是Unity所涉及所有物体的基类。

先看一下Object重载的运算符:

Operators
bool Does the object exist?
operator != Compares if two objects refer to a different object.
operator == Compares if two objects refer to the same.

下面几个注意点是我在最近使用发现的。

(1)Object类重载了类型隐式转换运算符“bool”。这个如果不注意,在某些情况下可能会造成意料外的调用。

class Test:MonoBehaviour
{

     void Start()
     {
        Fun(transform);//此函数目的是为了调用 void Fun(system.Object objFlag)

     }

     void Fun(bool value)
     {
         Debug.Log("call the bool param fun,the value is:"+value.ToString();)
     }

     void Fun(system.Object objFlag)
     {
         Debug.Log("call the param system.Object fun,the value is:"+value.ToString();)
     }

}

打印的日志是:call the bool param fun,the value is: true

可以看出,与我们的目的不一致。通过追溯Transform父类,其顶层基类是UnityEngine.Object。这就找到原因了,在这样的情况下这两个Fun函数存在调用歧义。transform先被判断是否存在的引用,然后调用了void Fun(bool value)

建议:同一个类尽量不要使用同名函数,如有要使用同名函数时要特别注意这两种情况。

(2)Object类重载了类型隐式转换运算符“==”。这个在与null比较时要特别注意,既使是有效的引用结果有可能是true的。

例:

GameObject go = new GameObject(); 
Debug.Log (go == null); // false

Object obj = new Object();
Debug.Log (obj == null); // true

看一下官方的说明(英文不好翻译不来):

Instatiating a GameObject adds it to the scene so it's completely initialized (!destroyed). Instantiating a simple UnityEngine.Object has no such semantics, so the it stays in the 'destroyed' state which compares true to null.

AndroidJavaException: java.lang.ClassNotFoundException: com.yourcompany.filechooser.FileChooser java.lang.ClassNotFoundException: com.yourcompany.filechooser.FileChooser at java.lang.Class.classForName(Native Method) at java.lang.Class.forName(Class.java:509) at com.unity3d.player.UnityPlayer.nativeRender(Native Method) at com.unity3d.player.UnityPlayer.access$800(Unknown Source:0) at com.unity3d.player.UnityPlayer$g$1.handleMessage(Unknown Source:181) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:193) at com.unity3d.player.UnityPlayer$g.run(Unknown Source:20) Caused by: java.lang.ClassNotFoundException: Didn't find class "com.yourcompany.filechooser.FileChooser" on path: DexPathList[[zip file "/data/app/com.CloudClusterStudio.zpqdemo-mDt92J6AodOZRKXqTUs2Yg==/base.apk"],nativeLibraryDirectories=[/data/app/com.CloudClusterStudio.zpqdemo-mDt92J6AodOZRKXqTUs2Yg==/lib/arm64, /data/app/com.CloudClusterStudio.zpqdemo-mDt92J6AodOZRKXqTUs2Yg==/base.apk!/lib/arm64-v8a, /system/lib64, /system/vendor/lib64]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134) at java.lang.ClassLoader.loadClass(ClassLoader.java:379) at java.lang.ClassLoader.loadClass(ClassLoader.java:312) ... 8 more at UnityEngine.AndroidJNISafe.CheckException () [0x00000] in <00000000000000000000000000000000>:0 at UnityEngine.AndroidJNISafe.FindClass (System.String name) [0x00000] in <00000000000000000000000000000000>:0 at UnityEngine.AndroidJavaClass._AndroidJavaClass (System.String className) [0x00000] in <00000000000000000000000000000000>:0 at UnityEngine.AndroidJavaClass..ctor (System.String className) [0x00000] in <00000000000000000000000000000000>:0 at 导出.开始导出 () [0x00000] in <00000000000000000000000000000000>:0 at UnityEngine.Events.InvokableCall.Invoke () [0x00000] in <00000000000000000000000000000000>:0 at UnityEngine.Events.UnityEvent.Invoke () [0x00000] in <00000000000000000000000000000000>:0 at UnityEngine.UI.Button.Press () [0x00000] in <00000000000000000000000000000000>:0 at UnityEngine.UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData) [0x00000] in <00000000000000000000000000000000>:0 at UnityEngine.EventSystems.ExecuteEvents.Execute (UnityEngine.EventSystems.IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData) [0x00000] in <00000000000000000000000000000000>:0 at UnityEngine.EventSystems.ExecuteEvents+EventFunction`1[T1].Invoke (T1 handler, UnityEngine.EventSystems.BaseEventData eventData) [0x00000] in <00000000000000000000000000000000>:0 at UnityEngine.EventSystems.ExecuteEvents.Execute[T] (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.ExecuteEvents+EventFunction`1[T1] functor) [0x00000] in <00000000000000000000000000000000>:0 at UnityEngine.EventSystems.StandaloneInputModule.ProcessTouchPress (UnityEngine.EventSystems.PointerEventData pointerEvent, System.Boolean pressed, System.Boolean released) [0x00000] in <00000000000000000000000000000000>:0 at UnityEngine.EventSystems.StandaloneInputModule.ProcessTouchEvents () [0x00000] in <00000000000000000000000000000000>:0 at UnityEngine.EventSystems.StandaloneInputModule.Process () [0x00000] in <00000000000000000000000000000000>:0 at UnityEngine.EventSystems.EventSystem.Update () [0x00000] in <00000000000000000000000000000000>:0 UnityEngine.DebugLogHandler:Internal_LogException(Exception, Object) UnityEngine.DebugLogHandler:LogException(Exception, Object) UnityEngine.Logger:LogException(Exception, Object) UnityEngine.Debug:LogException(Exception) UnityEngine.EventSystems.ExecuteEvents:Execute(GameObject, BaseEventData, EventFunction`1) UnityEngine.EventSystems.StandaloneInputModule:ProcessTouchPress(PointerEventData, Boolean, Boolean) UnityEngine.EventSystems.StandaloneInputModule:ProcessTouchEvents() UnityEngine.EventSystems.StandaloneInputModule:Process() UnityEngine.EventSystems.EventSystem:Update() 报错如何解决
最新发布
07-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值