XLua笔记

8 篇文章 0 订阅
这篇博客详细介绍了XLua在C#和Lua交互中如何进行强制类型转换,使用get_generic_method调用带泛型的函数,以及值类型转换。同时,还探讨了XLua如何重写C#的属性以及处理带有ref和out参数的函数。这些内容对于理解XLua在实际项目中的应用非常有帮助。
摘要由CSDN通过智能技术生成

1、XLua强制类型转换

cast(data,type)

第一个参数是需要强转的对象,第二个参数是目标类型

例如:有一个对象_resData需要强转为C#类型ResourceData。

local _resdata=_data
cast(_resdata, typeof(CS.MapTileResourceData))

 原因: xlua.cast实现了改功能,LuaEnv.cs文件中初始化了cast 

cast = xlua.cast

2、XLua调用带泛型函数(通过提供的xlua.get_generic_method方法调用。)

创建一个带泛型的Test函数。

//测试类
public class Test
    {
        private int a = 100;
        //泛型方法
        public int GenericMethodTest<T>(T t)
        {
            Debug.Log(t);
            Debug.Log(typeof(T));
            return a;
        }
    }

 XLua中代码如下:

//实例化Test类
local test=CS.Test.Test()
//取得泛型方法    CS.Test为命名空间
local testGenericFunc=xlua.get_generic_method(CS.Test.Test,"GenericMethodTest")
//为泛型方法指定类型
local realFunc=testGenericFunc(typeof(CS.System.Int32))
 
//调用 若泛型方法为静态,则无需传第一个实例参数
realFunc(test,5)

 

 local YKApplication_Ins = CS.YoukiaUnity.App.YKApplication.Instance
    local _SceneManagers = xlua.get_generic_method(CS.YoukiaUnity.App.YKApplication, "GetManager")
    local _temp = _SceneManagers(CS.YoukiaUnity.Scene.SceneManager)

    local _SceneManager =_temp(YKApplication_Ins)

引用:XLua学习

https://github.com/Tencent/xLua/commit/fa1b6d85557a525c920bef75dda91da6e8e99454

 

3、值类型强转

原因:Xlua的C#代码中找到一个类RawObject.cs,实现了几个强转的函数。

 CS.XLua.Cast.Int32(_finalDamage)

4、Xlua重写C#的属性

直接重写get_XXX(),或set_XXX()方法。

C# 中属性的本质,编译成中间语言后是 get、set 两个方法,调用属性实际上是调用 get 或 set 方法。get 对应名为“get_属性名”的方法,set 对应名为“set_属性名"的方法。

 

5、带有ref out 参数的函数

函数返回值返回  ref  out的值。

 

使用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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值