|
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[2] = 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[string field]或者this[object field]操作符重载为什么在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[string field]或者this[object field]才有这两个替代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标签来避免。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|