欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 资讯 > Lua笔记

Lua笔记

2025/2/22 2:08:02 来源:https://blog.csdn.net/Jesui/article/details/145643206  浏览:    关键词: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问题

不识别粘贴来的空格

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

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

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词