APSchmidt 发表于 2021-8-11 15:56

XLua记录

1.ipairs 和 pairs 对待nil成员的区别

function Test:Show()    local t = { name = {1, 2, 3}, name1 = {4,5,6}, name2 = {7,8,9}, name3 = {10, 11, 12} }    t.name2 = nil    local t1 = {{1}, {4, 5}, {7,8}, {10, 11, 12} }    t1 = nil    for k,v in pairs(t) do      Logger.Log(Logger.Module.COMMON, k)      Logger.Log(Logger.Module.COMMON, #v)    end    for k,v in ipairs(t1) do      Logger.Log(Logger.Module.COMMON, k)      Logger.Log(Logger.Module.COMMON, #v)    endend输出:


可以看到pairs对待table中的nil, 不会截断后续的输出。而ipairs对待table中nil, 会截断后面的输出内容。
2.遍历animation

方法1:
        local iter = t_animation:GetEnumerator()        while iter:MoveNext() do                local v = iter.Current                v.speed = show and 1.0 or -1.0        end方法2:
    for k,v in pairs(t_animation) do            v.speed = show and 1.0 or -1.0    end3.this或者this操作符重载为什么在lua无法访问?(比如Dictionary<string, xxx>, Dictionary<object, xxx>在lua中无法通过dic['abc']或者dic.abc检索值)

因为:1、这个特性会导致基类定义的方法、属性、字段等无法访问(比如Animation无法访问到GetComponent方法);2、key为当前类某方法、属性、字段的名字的数据无法检索,比如Dictionary类型,dic['TryGetValue']返回的是一个函数,指向Dictionary的TryGetValue方法。
如果你的版本大于2.1.11,可以用get_Item来获取值,用set_Item来设置值。要注意只有this或者this才有这两个替代api,其它类型的key是没有的。
dic:set_Item('a', 1)dic:set_Item('b', 2)print(dic:get_Item('a'))print(dic:get_Item('b'))如果你的版本小于或等于2.1.11,建议直接方法该操作符的等效方法,比如Dictionary的TryGetValue,如果该方法没有提供,可以在C#那通过Extension method封装一个使用。
4.xLua虚拟机的重启

在热更新机制中,如果在热更新完成后,需要重启lua虚拟机,在xlua的机制下,需要注意,重启lua虚拟机的操作,不能来自于lua端,只能是来自于c#端,也就是lua不能自己调用自己的重启。
5.子类加了LuaCallCSharp 基类需要加吗

   xLua只会生成加了该配置的类型,不会自动生成其父类的适配代码,当访问子类对象的父类方法,如果该父类加了LuaCallCSharp配置,则执行父类的适配代码,否则会尝试用反射来访问。
反射访问除了性能不佳之外,在il2cpp下还有可能因为代码剪裁而导致无法访问,后者可以通过下面介绍的ReflectionUse标签来避免。
页: [1]
查看完整版本: XLua记录