Unity中使用xLua基础

xLua基础篇

前置工作:创建好空的Unity工程并导入xLua中的Asset文件夹 (xLua下载地址

加载运行Lua代码

在C#中使用xLua主要是通过XLua命名空间中的LuaEnv中的DoString去运行Lua代码,如下图所示:

1

再进一步,就是我们创建一个Resources文件夹,并在里面创建一个HelloWorld.lua.txt文件(这里后缀必须加上.txt才能让Unity和xLua的loader识别),然后在脚本里面读取这个文本文档里面的Lua代码并在Unity中运行,如下图所示:

2
当然,你也可以不放在Resources文件夹下,任意放到你喜欢的位置然后用IO读取里面的内容在运行,这部分不是这篇文章的重点,就不演示了。

上面的这种读取方法其实还不是最合适的。最合适的用法应该是调用Lua的loader去读取文件。因为xLua配置了一个从Resources中读取文件的loader,所以只要执行require语句,并传入文件名,对应的loader就会找到这个文件并运行里面的代码。注意,文件名后缀必须是.txt,这里在上面也有提到过。具体代码如下:

3

既然提到Loader,那就肯定要学习自定义loader。其实所谓的自定义Loader就是一个CustomLoader的委托,只要创建对应签名的方法,然后把这个方面作为参数添加到LuaEnv中,xLua就会在执行“require”时自动调用这些loader,直到返回值不为空为止。

下面是例子,我写了一个自己的loader,功能是从StreamingAssets这个文件夹中搜查读取目标文本文档,代码如下:4

C# Call Lua

获取全局变量

一、获取一个全局基本数据类型
访问LuaEnv.Global就可以了,上面有个模版Get方法,可指定返回的类型。
luaenv.Global.Get(“a”)
luaenv.Global.Get(“b”)
luaenv.Global.Get(“c”)

二、获取table类型对应到类和接口中
获取一个table就相对要麻烦一些,因为table可以被指定为C#多种数据结构,可以作为自定义的类去一一对应table的元素接受,也可以作为一个接口然后同样一一对应属性去接受等。

对于用类或者接口去接受table,有几点要注意:

  • 类接收过来的变量是值拷贝,而接口则类似于引用拷贝。即是说,接收后,在类中对字段的修改不会修改到原来的Lua代码,而接口的则可以
  • 使用接口的接收依赖生成代码,所以需要在给接口添加 [CSharpCallLua]特性

代码如下:

这个是Lua文档,方便对照参考:
这里有一个地方要注意,当方法有参数时,第一个参数记得传一个占位参数代表是self,我这里随手写了个arg,用self或者任意东西都可以,自己理解就行。缺少这个占位参数,就会报错。
5
然后就是C#代码:6
三、获取table类型对应到Dictonary和List中

用这两个数据结构去接受好处就是不需要创建新的数据结构,也比较简单。不过有一些地方需要注意:

  • table转换到Dictionary后所有键值(如果有的话),都是string 类型的,所以如果含有多种类型的值,一般都需要用Dictionary<string,object>()去接受
  • Dictionary是能接受含有键的值,List只接受没有键的内容
  • Dictionay和List都是,只接受自己声明类型的对应的值。即List会把table里的所有数字类型接收过来,不过要注意因为Lua只有number数字类型,有可能造成精度丢失,如3.3转换成int可能直接为0

四、获取全局function变量

1.委托
function在Lua中也是一种变量,因此也可以被接收,而C#虽然没有对应的变量,却可以用委托去接受。

对应的委托只要签名相同即可。只需注意一点,Lua中的方法可以有多个返回值,那么对应到C#中就要用out/ref参数去接受这些返回值。具体的自己试验一下就好,并没有什么难度。代码如下:
7
同时还要注意,在释放LuaEnv之前,要把我们获取到的委托引用清除掉才能执行lua.Dispose(),不然就会报错。

2.LuaFunction
如果要获取的方法调用不频繁,可以直接用这个类去直接接收而省去新建一个delegate的繁琐。不过这个方法性能损耗很大(还有上面没有提到的LuaTable),慎用。

调用LuaFunction.Call()可以传参,然后全部的返回值都会放到一个Object数组中,代码如下:
8

Lua Call C#

Lua中调用C# 我个人觉得官方留的教程文档就十分完善,所以我这里就对照着文档写了一些简单的调用例子并加上注释来当做演示,请打开官方XLua教程文档食用。

在那之前,我先提一下C#和Lua对于方法返回值和参数的不同处理。这里我写了一个对照样式,先是原本的C#方法,然后再往下是对应的Lua方法,上图:

9
首先看C# 方法,可以看到,该方法有2个常规参数,一个ref 参数,一个out参数,一个返回值。对应到Lua就是下图的方法:
10
可以看到,在Lua中参数有3个,返回值也是3个。这是因为在Lua中,C#的ref参数会同时被当做参数和返回值来处理;而out参数则不会被当做参数,仅仅当做返回值来对待。那么,Lua中的三个返回值就分别对应C#方法中的常规返回值和按顺序传入的ref和out参数。

然后最后就是一点比较零碎的例子:
在这里插入图片描述

全篇完,希望有帮到正在学习或者复习的各位同学,谢谢阅读!

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用XLua可以在Unity实现Lua脚本的编写,同时也可以让Lua脚本与C#代码进行交互。 以下是基本的使用步骤: 1. 下载XLua插件并导入到Unity。 2. 在Unity创建一个新的Lua文件,编写Lua脚本代码。 3. 在C#代码使用XLua的API来加载并运行Lua脚本,例如: ``` using XLua; public class LuaManager : MonoBehaviour { private LuaEnv luaEnv; void Awake() { luaEnv = new LuaEnv(); luaEnv.DoString("require 'main'"); // 加载并执行Lua脚本 } void Update() { luaEnv.Tick(); // 更新Lua环境 } void OnDestroy() { luaEnv.Dispose(); // 释放Lua环境 } } ``` 在上面的例子,`Awake()`方法创建了一个Lua环境,然后通过`DoString()`方法加载并执行了Lua脚本。`Update()`方法每帧都调用了`Tick()`方法来更新Lua环境,`OnDestroy()`方法释放了Lua环境。需要注意的是,在实际的项目,可能需要更加复杂的逻辑和管理方式来处理Lua脚本的加载和运行。 4. 在Lua脚本使用XLua提供的API来调用C#代码或者导出Lua模块,例如: ``` -- 导出一个Lua模块 local module = {} module.foo = function() print("Hello from Lua!") end return module -- 调用C#代码 local gameObject = CS.UnityEngine.GameObject("LuaObject") local transform = gameObject.transform transform.position = CS.UnityEngine.Vector3(1, 2, 3) ``` 在上面的例子,导出了一个名为`module`的Lua模块,并定义了其的一个函数`foo()`。同时,也调用了C#代码的API来创建了一个新的GameObject,并修改了它的Transform组件的位置。 XLua还提供了其他的功能,例如自定义导出规则、GC优化等。在使用XLua之前,建议先了解一些基本的Lua语法和C#Lua交互的机制,以便更好地使用XLua

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kayn_Liu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值