xlua学习笔记

xlua学习笔记

💡 原文中文,约4000字,阅读约需10分钟。
📝

内容提要

本文介绍了在LuaEnv中加载和执行Lua脚本的方法,包括使用DoString、加载文件和自定义Loader。建议使用单一LuaEnv,通过require加载主脚本。同时讨论了C#与Lua的交互,包括访问全局变量、映射类和接口、使用字典和列表,以及Lua调用C#的方法和参数处理规则。

🎯

关键要点

  • 使用LuaEnv中的DoString方法来执行Lua脚本,建议一个游戏只创建一个LuaEnv。

  • 通过文件执行Lua代码时,可以使用TextAsset加载Lua文件。

  • 推荐的加载Lua脚本方式是通过DoString('require 'main''),在main.lua中加载其他脚本。

  • C#访问Lua全局变量需要先加载Lua脚本,然后通过LuaEnv.Global.Get获取变量。

  • C#访问Lua table时,接口必须是public修饰,且映射的属性可以多于或少于class的属性。

  • 映射到Dictionary和List时,要求table下的key和value类型一致,且这种方法较轻量级。

  • C#访问Lua全局函数建议使用delegate映射,性能更好且类型安全。

  • Lua调用C#时,读写静态属性和调用静态方法的方式有所不同。

  • Lua调用C#的参数处理规则与返回值处理规则需要注意,特别是ref和out参数的处理。

  • 枚举值可以通过__CastFrom方法实现从整数或字符串到枚举值的转换。

🔎

延伸解读

LuaEnv的使用建议

在使用LuaEnv时,建议每个游戏只创建一个LuaEnv实例。这是因为每个LuaEnv相当于一个独立的Lua虚拟机,多个实例可能导致资源浪费和管理复杂性。通过统一的LuaEnv,可以更高效地管理Lua脚本的加载和执行。

C#与Lua交互的注意事项

在C#访问Lua全局变量时,确保先加载Lua脚本并通过LuaEnv.Global.Get方法获取变量。此外,映射到接口时,必须使用public修饰符和[CSharpCallLua]特性,否则会导致错误。这些细节对于确保C#与Lua的顺利交互至关重要。

性能优化建议

在C#调用Lua函数时,使用delegate映射可以显著提高性能和类型安全性。虽然需要生成额外的代码,但这种方式在处理返回值和多返回值时表现更佳,适合对性能有较高要求的应用场景。

延伸问答

如何在LuaEnv中执行Lua脚本?

可以使用LuaEnv中的DoString方法来执行Lua脚本,建议一个游戏只创建一个LuaEnv。

C#如何访问Lua中的全局变量?

C#访问Lua全局变量需要先加载Lua脚本,然后通过LuaEnv.Global.Get获取变量。

在C#中如何映射Lua的table?

C#访问Lua table时,接口必须是public修饰,且映射的属性可以多于或少于class的属性。

使用delegate映射C#全局函数有什么优势?

使用delegate映射C#全局函数性能更好且类型安全,支持带返回值和多返回值。

Lua调用C#时参数处理规则是什么?

Lua调用侧的参数处理规则中,C#的普通参数算一个输入形参,ref修饰的算一个输入形参,out不算。

如何在Lua中加载和执行多个脚本?

推荐的方式是通过DoString('require 'main''),在main.lua中加载其他脚本。

🏷️

标签

➡️

继续阅读