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[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)
    end
end

输出:

可以看到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
    end

 

3.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标签来避免。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值