当前位置: 首页 > news >正文

Lua笔记

Lua语法

基本数据类型

number(包含整数和浮点数)、string、boolean、nil

基本语法

--注释

#字符串长度、table从1开始连续元素的长度

..字符串拼接

逻辑运算符 and or not

条件语句

if xxx then

elseif yyy then

else

end

循环语句

for i=1,xxx do

end

table元素的类型

table元素的数据类型可以是number、string、boolean、nil、function、table。根据访问元素的方式可以分为以下类型:

索引型

用[整数索引]访问,从1开始。

p={123,true,"1231",42}
print(p[1])
print(p[2])
print(p[3])
print(p[4])

 键型

键的数据类型可以是number、string、boolean、table、function,不能是nil。用table当键时,两个table地址不同就算不同,与内容无关。

local o={a={1,2,3},["b"]='呵呵呵',b="str",c=42,d={x=1,y=2},80,[4]="大家",["卧槽"]="暗黑",[{1,4}]=3,[{1,4}]="这也行吗",[function()print("没什么")end]="逆天"
}
for k,v in pairs(o) doprint(k,v)
end

键1和索引1元素同时存在时,[1]得到索引1的元素。 

有重复键时,访问得到最后一个重复键的元素。

字段型

字段名只能用符合变量名规则的名字。用.访问,不能用[]访问。

local o={a={1,2,3},b="str",c=42,d={x=1,y=2},
}
print(o.d)
print(o[b])

总结:table是融合了数组、字典、结构体/类的数据类型。 还超越了这些,它允许键重复,允许table、function当键。

关于pairs()遍历table

local o={a={1,2,3},b="str",c=42,d={x=1,y=2},["b"]='呵呵呵',80,[4]="大家",["卧槽"]="暗黑"
}
for k,v in pairs(o) doprint(k,v)
end

for k,v in pairs()遍历遇到重复键,包括键和字段名相同的,只会得到最后一个同名键/字段。索引型元素最先得到,键型和字段型顺序没发现规律。

xLua

Generate Code干了什么

肉眼可见的,在Asset文件夹生成了XLua/Gen文件夹,里面有一些脚本。然后对加了[CSharpCallLua]的变量寻找引用,发现它被XLua/Gen/DelegatesGensBridge引用了。也可以在这里查哪些类型加了[CSharpCallLua]。

public override Delegate GetDelegateByType(Type type){if (type == typeof(NoParamNoReturn)){return new NoParamNoReturn(__Gen_Delegate_Imp0);}if (type == typeof(DelegateLua)){return new DelegateLua(__Gen_Delegate_Imp0);}if (type == typeof(MyActionIntInt)){return new MyActionIntInt(__Gen_Delegate_Imp1);}return null;}

没加[CSharpCallLua]或没生成代码的变量被使用就报错:

C#调用lua

1.新建LuaEnv类;

luaEnv=new LuaEnv();

2.执行luaEnv.AddLoader()。输入是一个返回byte[]的函数,这个函数把一个lua脚本读取出全部字节返回。当luaEnv.DoString()执行require一个lua脚本时,它调用这个函数,把需要的lua脚本名传入,这个函数把脚本里的代码读出。

luaEnv.AddLoader(ProjectLoader);
byte[] ProjectLoader(ref string filePath){string path=string.Concat(luaPath,filePath,".lua");if(File.Exists(path)){return File.ReadAllBytes(path);}else{return null;}}

3.执行luaEnv.DoString(luaCode);执行单句lua代码,一般是"require('xxx')"执行一个lua脚本。

问题

'AppDomain' does not contain a definition for 'DefineDynamicAssembly':找不到AppDomain下的DefineDynamicAssembly方法

解决方法:把报错扔给百度查,得到下面的文章。

C#反射中使用到Emit时,发现AppDomain.CurrentDomain.DefineDynamicAssembly()方法并不存在 - 名字已被使用N次 - 博客园 (cnblogs.com)

里面让把AppDomain.CurrentDomain替换成AssemblyBuilder,照做,解决。原因应该是微软把这个方法移动地方了,且改成了静态方法。

百度查DefineDynamicAssembly,能看到官方文档里有两个类里出现这个方法。

AppDomain的适用版本:

AssemblyBuilder的适用版本:

创建运行环境报错xlua assembly:<unknown assembly> type:<unknown type> member:(null)

原因:没把Plugin文件夹拷过来

Lua里调用C#的委托报错InvalidOperationException: not a generic method definition

C#代码

Lua代码

报错:not a generic method definition

C#里添加并执行委托没错,Lua直接执行Func1()也没错。如果改成一个根本不存在的成员:

报错会不一样:

说明xLua是能找到这个成员的,但是不允许把函数赋给它。打印MyStaticDelegate,是nil,类型也是nil。给它赋一个整数,不报错,打印,还是nil,执行,报错说不能执行nil。

这是C#里定义的一个类:

在lua里遍历它:

结果:

发现它含有NPC里的静态成员,但是静态字符串name和静态委托MyStaticDelegate不见了,但是有一个UnderlyingSystemType,类型是NPC。

然后试图把NPC实例化一个对象,对这个对象遍历:

得到报错:ob是NPC类型,不是table,不能遍历:

遍历了一下CS,以为会有很多东西:

结果:

连我定义的NPC类也没有。

解决方法:在C#定义的无参无返回值委托、传入自身的委托前面加[CSharpCallLua],不管是在Lua使用C#委托,还是C#委托接收Lua函数,都要加。有参且不为表自身的委托(如传入字符串、整数)可以不加。

不要用print(CS.成员)验证一个成员存不存在,就算不存在,也会添加这个成员,类型是table。下图:print CS里一个根本不存在的成员,发现它有值,而且遍历显示这个成员已经被创建出来了:

Sublime Text问题

不识别粘贴来的空格

有时执行代码会报这种有�的错

经检查发现这是被识别的空格,里面有一点:

这是没被识别的空格,里面没有一点:


http://www.mrgr.cn/news/91638.html

相关文章:

  • 泰山派RK3566移植QT,动鼠标时出现屏幕闪烁
  • Kubernetes的Ingress 资源是什么?
  • linux使用
  • 导出指定文件夹下的文件结构 工具模块-Python
  • 使用rknn进行yolo11-pose部署
  • 数组和指针常见笔试题(深度剖析)
  • POI pptx转图片
  • fpga助教面试题
  • 单细胞转录组画小提琴VlnPlot只显示需要类型细胞
  • 在项目中调用本地Deepseek(接入本地Deepseek)
  • DeepSeek大模型简介
  • MySQL 主从复制原理及其工作过程
  • ubuntu源码方式安装TensorRT-LLM推理框架(超详细)
  • VScode C语言学习开发环境;运行提示“#Include错误,无法打开源文件stdio.h”
  • CRTP在项目优化中的使用
  • uniapp图像转换(获取本地选取或拍照的图片的base64、Blob、图像和base64的转换)
  • Linux的基础指令和环境部署,项目部署实战(下)
  • A-LOAM源代码解析(一)
  • android,flutter 混合开发,pigeon通信,传参
  • 问题记录汇总