0%

Lua其他

lua特点

脚本语言,嵌入式,标准C编写;8个数据类型1个数据结构;可作为脚本或者配置文件
特点:

  1. 可扩展(接口和机制)
  2. 支持面向过程编程和函数式编程

动态语言,Lua轻量级嵌入式语言,标准C编写而成
可作为脚本或者配置文件,将table作为唯一的数据结构,官方将table分为两种一个为数组一个为哈希。
Lua解释器小
轻量级(由标C编写,嵌入式编程),可扩展(接口和机制)。支持面向过程编程和函数式编程。

lua数据类型

8个:nil、boolean、number、string、userdata、function、thread和table。
其中:Lua 把 false 和 nil 看作是”假”,其他的都为”真”

pairs 与 ipairs的区别

pairs:迭代table,可以遍历表中所有key可以返回nil
ipairs:迭代数组,不能返回nil,遇见nil退出

lua元表

元表:对不同table之间进行操作,允许改变table行为且每个行为关联对应元方法。
setmetatable:设置table为元表(metatable)
注:如果元表中存在__metatable键值,set会失败
getmetatable:返回对象元表(metatable)

LuaClass

见链接
云风 :缺点 无法调用同名父类函数
https://blog.csdn.net/MilerKey/article/details/96457594

Lua闭包

https://blog.csdn.net/MilerKey/article/details/96461578

Lua优化细节
C#和Lua的互相调用

https://blog.csdn.net/Pan_mouren/article/details/81000303
虚拟栈,wrap完成注册

Lua Call C#:先生成C#源文件所对应的Wrap文件或者编写C#源文件所对应的c模块,然后将源文件内容通过Wrap文件或者C模块注册到Lua解释器中,然后由Lua去调用这个模块的函数。
C# Call Lua:C#把请求或数据放在栈顶,然后lua从栈顶取出该数据,在lua中做出相应处理(查询,改变),然后把处理结果放回栈顶,最后C#再从栈顶取出lua处理完的数据,完成交互。

C#和Lua交互以及注意事项

lua-C-C#。C#调用lua的过程是C#-C-lua。
https://blog.uwa4d.com/archives/USparkle_Lua.html

Lua热更新的原理实现

Lua的 require(modelname) 把一个lua文件加载存放到package.loaded[modelname]。
当我们加载一个模块的时候,会先判断是否在package.loaded中已存在,若存在则返回改模块,不存在才会加载(loadfile),防止重复加载。
package.loaded是一个Table,其中包含了全局表_G、默认加载的模块(string, debug, package, io, os, table, math, coroutine)和用户加载的模块。

为什么选择Lua作为热更新

回答问题前先说明几个问题:
1、ios支持反射,C#写的反射代码都可以正常使用。但是不支持Reflection.Emit。
2、ios不能用c# jit,事实上我们在ios上的代码是AOT的。
3、ios不能用c#热更是因为启动了CPU的No eXecute bit,简单说就是AppStore审核过的代码才能执行。而lua解释器是审核过的,这才是为何lua可以运行在ios上的根本原因。

回答正题:
Q:请问lua怎么做热更新?
A:lua的执行依赖于其解释器,通常来说就是lua.c中的代码。lua在unity中作为一个文本资源来使用,当我们通过tolua或者xlua调用lua代码中某个函数时,解释器会去对lua进行解释,因为lua解释器代码允许执行,因此它会执行lua解释后的代码。
Q:是把逻辑用lua脚本来写?
A:基本就是游戏玩法的代码。网络、资源加载等基础模块一般不会变,所有很多都是用C#写的。说白了,不变的代码用C#写更高效,变化的代码用lua写。
Q:还是lua只用来打包资源?
A:打包和lua唯一的关系就是lua代码文件作为资源被打包。