雪千渔Blog

  • 首页
  • 写写代码
    • dotNet
    • C++
    • Lua
    • Visual Basic
    • Java
    • Android
    • Web
  • DCC
    • Maya
    • Maya-Plug
    • AfterEffect
    • AfterEffect-Plug
    • PhotoShop-Plug
  • 游戏制作
    • Unity3D
    • UnrealEngine
    • 经验杂谈
    • 游戏设计
    • 自研引擎
    • 效果实现
  • 其他
    • 乱七八糟
    • 软件工具
    • 留言板
    • 自制素材
    • 关于我
  • 世界的尽头
雪千渔blog
唯有热爱,能抵漫长岁月
  1. 首页
  2. Coding
  3. Lua
  4. 正文

xLua无法判断Unity对象为nil的问题

2020年3月6日 7973点热度 10人点赞 0条评论

在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写一个扩展方法:

[LuaCallCSharp]
[ReflectionUse]
public static class UnityEngineObjectExtention
{
    public static bool IsNull(this UnityEngine.Object o) // 或者名字叫IsDestroyed等等
    {
        return o == null;
    }
}

然后在lua侧对所有UnityEngine.Object实例都使用IsNull判断
print(go:GetComponent('Animator'):IsNull())

Lua侧的实现

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

nulluobj = setmetatable({__type = "nullobj"}, {__eq = function(a, b)
    local nul = b
    local target = a
    if a.__type == "nullobj" then
        nul = a 
        target = b
    end
 
    --unity Object
    if type(target) == "userdata" and target.IsNull ~= nil then
        return target:IsNull()
    end
 
    return false
end})

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

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

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

local go = CS.UnityEngine.GameObject.Find("cube")
if go == nulluobj then
    -- TODO
end

 

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: Unity xLua
最后更新:2021年5月6日

JomiXedYu

一名游戏玩家。

点赞
< 上一篇
下一篇 >

文章评论

取消回复

*

code

JomiXedYu

一名游戏玩家。

分类
  • AfterEffect / 6篇
  • AfterEffect-Plug / 1篇
  • Android / 1篇
  • C++ / 13篇
  • dotNet / 12篇
  • Lua / 4篇
  • Maya / 2篇
  • Maya-Plug / 2篇
  • Office-VSTO&VBA / 2篇
  • Unity3D / 14篇
  • UnrealEngine / 4篇
  • Visual Basic / 8篇
  • Web / 2篇
  • 乱七八糟 / 2篇
  • 效果实现 / 2篇
  • 经验杂谈 / 2篇
  • 自制素材 / 3篇
  • 自研引擎 / 1篇
  • 计算机图形学 / 1篇
  • 软件工具 / 4篇
友情链接
  • DorinXL
  • 小博博客
  • 秋橘斋
文章目录
  • 在xlua中无法判断GameObject类型对象是否为nil
  • Lua侧的实现

COPYRIGHT © 2014-2021 雪千渔Blog. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS

辽ICP备20006894号-1