在xlua中无法判断GameObject类型对象是否为nil

faq原文:https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/faq.md

faq标题:有的Unity对象,在C#为null,在lua为啥不为nil呢?比如一个已经Destroy的GameObject。

faq内容:其实那C#对象并不为null,是UnityEngine.Object重载的==操作符,当一个对象被Destroy,未初始化等情况,obj == null返回true,但这C#对象并不为null,可以通过System.Object.ReferenceEquals(null, obj)来验证下。

对应这种情况,可以为UnityEngine.Object写一个扩展方法:

{{EJS0}}

然后在lua侧对所有UnityEngine.Object实例都使用IsNull判断

{{EJS1}}

Lua侧的实现

我们要在lua中更方便的去判断,不能使用go == nil, 那我们就自己声明个nil。

{{EJS2}}

使用元函数定义了一个nulluobj的表。

该表重载了==运算符,__eq中的a和b是按照运算位置来传递的,所以要先判断哪个对象为目标判断对象。

看了这段代码会发现是没有对形参进行判空处理,因为如果一个==表达式中目标判断对象为nil或者为值类型的时候,结果直接为false,而不会进入到运算符重载方法中。如果目标判断对象是一个unityObject,那就直接调用C#中写的扩展方法返回,如果不是,直接返回false(不为空)。

{{EJS3}}