NLua 文档

打印 上一主题 下一主题

主题 989|帖子 989|积分 2967

目录
入门指南
使用 .Net 对象
沙盒机制
Unity 集成
Unity 使用留意事项


github 地址:
https://github.com/NLua/NLua

入门指南

NLua 允许在 UWP、Windows、Linux、Mac、iOS、Android 上使用 C# 中的 Lua。
  1. public class SomeClass
  2. {
  3.     public string MyProperty { get; private set; }
  4.     public SomeClass(string param1 = "defaulValue")
  5.     {
  6.         MyProperty = param1;
  7.     }
  8.     public int Func1()
  9.     {
  10.         return 32;
  11.     }
  12.     public string AnotherFunc(int val1, string val2)
  13.     {
  14.         return "Some String";
  15.     }
  16.     public static string StaticMethod(int param)
  17.     {
  18.         return "Return of Static Method";
  19.     }
  20. }
复制代码
Using UTF-8 Encoding:
NLua 运行在 KeraLua 绑定层之上,默认环境下它使用 ASCII 编码来处理字符串。假如你希望使用 UTF-8 编码,只需将 Lua.State.Encoding 属性设置为 Encoding.UTF8 即可:
  1. using (Lua lua = new Lua())
  2. {
  3.         lua.State.Encoding = Encoding.UTF8;
  4.         lua.DoString("res = 'Файл'");
  5.         string res = (string)lua["res"];
  6.         Assert.AreEqual("Файл", res);
  7. }
复制代码
创建 Lua 状态:
  1. using NLua;
  2.        
  3. Lua state = new Lua ()
复制代码
盘算简单表达式:
  1. // Lua can return multiple values, for this reason DoString return a array of objects
  2. // Lua 可以返回多个值,因此 DoString 返回一个对象数组
  3. var res = state.DoString ("return 10 + 3*(5 + 2)")[0] as double;
复制代码
将原始值通报给 state:
  1. double val = 12.0;
  2. state ["x"] = val; // Create a global value 'x'
  3. var res = (double)state.DoString ("return 10 + x*(5 + 2)")[0];
复制代码
获取全局变量:
  1. state.DoString ("y = 10 + x*(5 + 2)");
  2. double y = (double) state ["y"]; // Retrieve the value of y 检索y的值
复制代码
获取 Lua 函数:
  1. state.DoString (@"
  2. function ScriptFunc (val1, val2)
  3.         if val1 > val2 then
  4.                 return val1 + 1
  5.         else
  6.                 return val2 - 1
  7.         end
  8. end
  9. ");
  10. var scriptFunc = state ["ScriptFunc"] as LuaFunction;
  11. // LuaFunction.Call will also return a array of objects, since a Lua function
  12. // can return multiple values
  13. //Lua函数,调用将返回一个对象数组,因为Lua函数可以返回多个值
  14. var res = (int)scriptFunc.Call (3, 5).First();
复制代码

使用 .Net 对象

向 state 通报 .Net 对象:
  1. SomeClass obj = new SomeClass ("Param");
  2. // Create a global value 'obj' of .NET type SomeClass
  3. //创建的 .net SomeClass类 global 值 “obj”
  4. state ["obj"] = obj;
  5. // This could be any .NET object, from BCL or from your assemblies
  6. //这可能是任何 .net 对象,来自 BCL 或者程序集
复制代码
在 Lua 中使用 .NET 程序集:
要访问任何 .NET 库以在 Lua 中创建对象、事件等,需要让 NLua 将 CLR 作为 Lua 包加载。只需调用 LoadCLRPackage 方法,并在您的 Lua 脚本中使用 import 函数加载程序集。例如:
  1. state.LoadCLRPackage ();
  2. state.DoString (@" import ('MyAssembly', 'MyNamespace')
  3.                    import ('System.Web') ");
  4. // import will load any .NET assembly and they will be available inside the Lua context.
  5. // import 将会加载任何 .NET 程序集,并且它们将在 Lua 上下文中可用。
复制代码
创建 .NET 对象: 只需使用类名后跟 ( ) 来创建对象。
  1. state.DoString (@"
  2.         --you can suppress default values.可省略默认值
  3.         obj2 = SomeClass()
  4.         client = WebClient()
  5. ");
复制代码
调用实例方法: 要调用实例方法,需要使用 : 符号。可以从通报到 Lua 或在 Lua 上下文内创建的对象上调用方法。
  1. state.DoString (@"
  2. local res1 = obj:Func1()
  3. local res2 = obj2:AnotherFunc (10, 'hello')
  4. local res3 = client:DownloadString('http://nlua.org')
  5. ");
复制代码
调用静态方法: 您可以直接通过类名和 . 符号从 Lua 中调用静态方法。
  1. state.DoString (@"
  2. local res4 = SomeClass.StaticMethod(4)
  3. ");
复制代码
访问属性: 从 Lua 使用 . 符号即可获取(或设置)任何属性。
  1. state.DoString (@"
  2. local res5 = obj.MyProperty
  3. ");
复制代码
所有方法、事件或属性都必须是公共可用的,NLua 不会调用非公开成员。
假如您使用 Xamarin.iOS,需要对要在 NLua 中使用的类应用 [Preserve] 特性,否则链接器会在最终二进制文件中删除未使用的类。

沙盒机制

有许多方法可以在应用程序内部为脚本创建沙箱。强烈保举您使用纯 Lua 来实现沙箱。您可以重写 import 函数,确保在用户脚本执行前不加载 .NET 程序集。
  1. state.DoString (@"
  2.         import = function () end
  3. ");
复制代码
链接:
lua-users wiki: Sand Boxes

Unity 集成

1. 为 .NET 2.0 构建或从 NuGet 下载 KeraLua 和 NLua(使用下载包链接)
2. 假如选择下载:将文件扩展名从 .nupkg 更改为 .zip。
3. 在 Unity 项目的 Assets 目录中创建文件夹 Plugins/KeraLua 和 Plugins/NLua。
4. 将这些 zip 文件中的 netstandard2.0 内容解压到新创建的 Unity 文件夹中。您的目录结构应大抵如下(KeraLua 的运行时根据您的构建目标举行定制):
  1. Plugins
  2. ├── KeraLua
  3. │   ├── LICENSE
  4. │   ├── LICENSE.meta
  5. │   ├── lib
  6. │   │   ├── netstandard2.0
  7. │   │   │   ├── KeraLua.dll
  8. │   │   │   ├── KeraLua.dll.meta
  9. │   │   │   ├── KeraLua.xml
  10. │   │   │   └── KeraLua.xml.meta
  11. │   │   └── netstandard2.0.meta
  12. │   ├── lib.meta
  13. │   ├── runtimes
  14. │   │   ├── linux-x64
  15. │   │   │   ├── native
  16. │   │   │   │   ├── liblua54.so
  17. │   │   │   │   └── liblua54.so.meta
  18. │   │   │   └── native.meta
  19. │   │   ├── linux-x64.meta
  20. │   │   ├── osx
  21. │   │   │   ├── native
  22. │   │   │   │   ├── liblua54.dylib
  23. │   │   │   │   └── liblua54.dylib.meta
  24. │   │   │   └── native.meta
  25. │   │   ├── osx.meta
  26. │   │   ├── win-x64
  27. │   │   │   ├── native
  28. │   │   │   │   ├── lua54.dll
  29. │   │   │   │   └── lua54.dll.meta
  30. │   │   │   └── native.meta
  31. │   │   ├── win-x64.meta
  32. │   │   ├── win-x86
  33. │   │   │   ├── native
  34. │   │   │   │   ├── lua54.dll
  35. │   │   │   │   └── lua54.dll.meta
  36. │   │   │   └── native.meta
  37. │   │   └── win-x86.meta
  38. │   └── runtimes.meta
  39. ├── KeraLua.meta
  40. ├── NLua
  41. │   ├── LICENSE
  42. │   ├── LICENSE.meta
  43. │   ├── lib
  44. │   │   ├── netstandard2.0
  45. │   │   │   ├── NLua.dll
  46. │   │   │   └── NLua.dll.meta
  47. │   │   └── netstandard2.0.meta
  48. │   └── lib.meta
  49. └── NLua.meta
复制代码
5. 在 Unity 检查器中逐个检察 KeraLua 运行时的 liblua54文件,并根据文件夹为编辑器和独立平台设置正确的平台设置。别忘了应用更改。

Unity 使用留意事项

•  你大概会想要将路径追加到 `package.path` 中,你可以通过类似如许的方式来实现:
  1. lua.DoString("package.path = package.path .. ";" + Application.persistentDataPath + "/?/?.lua;" + Application.persistentDataPath + "/?.lua"");
复制代码
•  你将需要将 `Debug.Log` 暴露给 Lua(并重写 `print` 函数以便检察 Lua 的日志输出)。
•  从 Lua 返回的数字将以 `double` 类型出现。
•  在 Lua 实例上设置的字段大概为 `null`,你需要妥善处理这种环境。

end

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

滴水恩情

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表