雪千渔Blog

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

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

2020年3月6日 8954点热度 11人点赞 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

独游开发者 & 技术美术

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

JomiXedYu

独游开发者 & 技术美术

最新 热点 随机
最新 热点 随机
HLSL对Vulkan的适应性以及伪语义绑定 GPU呈现模式与垂直空白 自研引擎PulsarEngine的Shader编译流程 UE材质Custom节点与HLSL的HACK操作 UE5出现D3D12崩溃报错解决方案 游戏引擎脚本绑定的三种写法与利弊
HLSL对Vulkan的适应性以及伪语义绑定
C++中的事件分发器与委托 在Unity程序运行时更改窗口图标设置标题 C#Winform使用CSkin制作VS2015风格界面 Discuz数据库迁移所需更改文件Apache更改端口 Unity资源打包经验概述 C#/Java 使用接口实现委托和事件订阅
友情链接
  • DorinXL
  • 小博博客
  • 秋橘斋

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

Theme Kratos Made By Seaton Jiang

辽ICP备20006894号-1