【踩坑】Xlua中GetComponent获取组件返回值不是nil

      好久没写东西了,因为疫情原因摸了好久的鱼,最近也没做什么有意思的东西,就随便记点最近踩到的坑吧~
      项目组最近使用Xlua进行开发,其实说实话Xlua,tolua对于我这种拼UI的辣鸡程序来说没啥区别,但是今天踩到了一个Xlua里getComponent的坑:我在lua中通过getComponent获取组件信息的时候,Image和Text组件拿到的都是nil,而canvas拿到的却是一个值为nil:0的userdata。

    local image = go and global_getComponent(go, "Image")
    local text = go and global_getComponent(go, "Text")
    local canvas = go and global_getComponent(go, "CanvasGroup")
    print(type(text), text)
    print(type(canvas), canvas)

      输出值为:

nil 
userdata    null: 0 

      当时我就震惊了,后来查阅资料看到,原来可能是unity获取组件失败不给我返回一个null,而是返回一个可以判断出是null的object?!然后在C#端可以判null,在lua就不行了!!!
      资料里写的方法是修改ObjectTranslator脚本中的push函数,添加object的判空o.Equals(null)进行解决的。但是我们这边的代码因为有封装过一层获取组件的接口:

    public static Component GetComponent(GameObject _go, string _compname)
    {
        if (_go == null)
            return null;
        Type t = GetComponentType(_compname);

        if (null == t)
        {
            DebugManager.DebugError("component class not find: " + _compname);
            return null;
        }
        //retrutn _go.GetComponent(t);
        var resultCom = _go.GetComponent(t);
        if (resultCom == null)
            return null;
        else
            return resultCom;
    }

      GetComponentType其实就是一个字典集,实现可以从字符串映射到type类型的功能,之前我们直接返回了GetComponent的结果,经过我自作聪明的XJB改,多了一层判空,也就是相当于在C#层对这个对象进行判空,然后再传递给lua,这样也可以解决这个问题!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • width: 65%;border: 1px solid #ddd;outline: 1300px solid #...
    邵胜奥阅读 4,910评论 0 1
  • 第一篇 语言 第0章 序言 Lua仅让你用少量的代码解决关键问题。 Lua所提供的机制是C不擅长的:高级语言,动态...
    testfor阅读 2,741评论 1 7
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 3,400评论 0 6
  • 将下列代码挂载到任何一个GameObject上,这样就能在Unity中加载并执行Resources/Lua文件夹下...
    BlauHimmel阅读 23,319评论 3 18
  • 这一章讲解Prefab。Prefab是饥荒世界构成的基础,也是Mod技术的基本内容。 Prefab,中文译名叫预制...
    LongFei_aot阅读 16,057评论 6 39