腾讯XLua 03-CSharp Invoke Lua
来源:互联网 发布:sql server报价 编辑:程序博客网 时间:2024/06/05 05:36
using UnityEngine;using System.Collections;using XLua;public class MyInvokeLua : MonoBehaviour {//创建一个接口 用于生成 调用函数 [CSharpCallLua] //这是一个生成调用函数用的标签 生成CSharp调用Lua,加这标签 public interface ICalc { int Add(int a, int b); int Mult { get; set; } } [CSharpCallLua] //(1)在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字。 //(2)该参数必须标识一个一维数组,但类型不限,对该参数传递null或者0个数目的数组的引用都是合法的* public delegate ICalc CalcNew(int mult, params string[] arg); //创建一个元表 private string script = @" local cal_mt = { __index = { Add = function(self, a, b) return (a + b) * self.Mult end } } //设置创建函数 Calc = { New = function(mult, ...) print(...) return setmetatable({Mult = mult}, calc_mt) end } "; void Start() { LuaEnv luaenv = new LuaEnv(); luaenv.DoString(script); //获得Calc.New方法 转换为CalcNew委托 CalcNew calc_new = luaenv.Global.GetInPath<CalcNew>("Calc.New"); //执行委托 获得函数 返回接口的引用 ICalc calc = calc_new(10, "hi", "john"); Debug.Log("sum(*10) = " + calc.Add(1, 2)); //修改Mult在内存中的值 calc.Mult = 100; Debug.Log("sum(*100) = " + calc.Add(1, 2)); luaenv.Dispose(); }}
点击工具栏上的 XLua/Generate Code 就会注册函数
//截取部分重要代码namespace CSObjectWrap{ public int Add(int a, int b) {#if THREAD_SAFT || HOTFIX_ENABLE lock (luaEnv.luaEnvLock) {#endif RealStatePtr L = luaEnv.L; int err_func = LuaAPI.load_error_func(L, luaEnv.errorFuncRef); LuaAPI.lua_getref(L, luaReference); //向栈中压入 "Add" LuaAPI.xlua_pushasciistring(L, "Add"); //安全判断,当栈第二位置为Table时,再往下执行 if (0 != LuaAPI.xlua_pgettable(L, -2)) { luaEnv.ThrowExceptionFromError(err_func - 1); } //CSharp压入"Add",Lua会将叫Add的元素放入栈顶,判断得到的是否是function if(!LuaAPI.lua_isfunction(L, -1)) { LuaAPI.xlua_pushasciistring(L, "no such function Add"); luaEnv.ThrowExceptionFromError(err_func - 1); } //将table表 压入栈顶 LuaAPI.lua_pushvalue(L, -2); //删除-3位置的元素 LuaAPI.lua_remove(L, -3); //压入第一个元素 LuaAPI.xlua_pushinteger(L, a); //压入第二个元素 LuaAPI.xlua_pushinteger(L, b); //现在在栈中的位置如下 //Add (-4)->table(-3)->a(-2)->b(-1) //调用方法(L,参数个数,返回值个数,错误方法) int __gen_error = LuaAPI.lua_pcall(L, 3, 1, err_func); if (__gen_error != 0) luaEnv.ThrowExceptionFromError(err_func - 1); int __gen_ret = LuaAPI.xlua_tointeger(L, err_func + 1); LuaAPI.lua_settop(L, err_func - 1); return __gen_ret;#if THREAD_SAFT || HOTFIX_ENABLE }#endif } public int Mult { get {#if THREAD_SAFT || HOTFIX_ENABLE lock (luaEnv.luaEnvLock) {#endif RealStatePtr L = luaEnv.L; int oldTop = LuaAPI.lua_gettop(L); LuaAPI.lua_getref(L, luaReference); LuaAPI.xlua_pushasciistring(L, "Mult"); if (0 != LuaAPI.xlua_pgettable(L, -2)) { luaEnv.ThrowExceptionFromError(oldTop); } //从栈顶获得int类型参数 int __gen_ret = LuaAPI.xlua_tointeger(L, -1); LuaAPI.lua_pop(L, 2); return __gen_ret;#if THREAD_SAFT || HOTFIX_ENABLE }#endif } set {#if THREAD_SAFT || HOTFIX_ENABLE lock (luaEnv.luaEnvLock) {#endif RealStatePtr L = luaEnv.L; int oldTop = LuaAPI.lua_gettop(L); //C#交互 同理 同上 LuaAPI.lua_getref(L, luaReference); LuaAPI.xlua_pushasciistring(L, "Mult"); LuaAPI.xlua_pushinteger(L, value); if (0 != LuaAPI.xlua_psettable(L, -3)) { luaEnv.ThrowExceptionFromError(oldTop); } LuaAPI.lua_pop(L, 1);#if THREAD_SAFT || HOTFIX_ENABLE }#endif } } }}//声明的绑定委托也会生成对应的代码 public MyInvokeLua.ICalc MyInvokeLuaICalc(int mult, string[] arg) {#if THREAD_SAFT || HOTFIX_ENABLE lock (luaEnv.luaEnvLock) {#endif RealStatePtr L = luaEnv.L; int err_func =LuaAPI.load_error_func(L, errorFuncRef); ObjectTranslator translator = luaEnv.translator; LuaAPI.lua_getref(L, luaReference); LuaAPI.xlua_pushinteger(L, mult); for (int __gen_i = 0; __gen_i < arg.Length; ++__gen_i) LuaAPI.lua_pushstring(L, arg[__gen_i]); int __gen_error = LuaAPI.lua_pcall(L, 1 + arg.Length, 1, err_func); if (__gen_error != 0) luaEnv.ThrowExceptionFromError(err_func - 1); MyInvokeLua.ICalc __gen_ret = (MyInvokeLua.ICalc)translator.GetObject(L, err_func + 1, typeof(MyInvokeLua.ICalc)); LuaAPI.lua_settop(L, err_func - 1); return __gen_ret;#if THREAD_SAFT || HOTFIX_ENABLE }#endif }
0 0
- 腾讯XLua 03-CSharp Invoke Lua
- 腾讯XLua 01-lua来写MonoBehaviour
- 【腾讯Bugly干货分享】手游热更新方案xLua开源:Unity3D下Lua编程解决方案
- 腾讯开源手游热更新方案Xlua尝鲜(三)——C#访问Lua
- 腾讯开源手游热更新方案Xlua尝鲜(四)——Lua调用C#
- 腾讯开源手游热更新方案Xlua尝鲜(二)——执行Lua字符串和Lua文件加载
- 初探腾讯Unity手游热更新方案xlua
- Unity3d腾讯手游热更新方案Xlua编程
- xLua增加第三方lua库lpack
- Xlua
- C#调用C++代码(CSharp Platform Invoke)
- 腾讯开源手游热更新方案Xlua尝鲜(五)——xLua的配置
- 腾讯开源手游热更新方案Xlua尝鲜(六)——xLua的相关API
- 腾讯开源手游热更新方案Xlua尝鲜(一)
- 腾讯XLua 02-UI事件与事例API
- 腾讯开源手游热更新方案:Unity3D下的XLua方案介绍
- 浅谈腾讯热更新开源框架xLua自定义Loader
- 手游热更新方案xLua开源:Unity3D下Lua编程解决方案
- 程序优化_数据查询
- CSDN--我的收藏地址
- Jni中执行ndk-build,编译第三方静态库(.a)和动态库(.so)的Android.mk文件写法
- 日志
- RapidIO技术研究1
- 腾讯XLua 03-CSharp Invoke Lua
- centos命令
- 栈的压入、弹出序列
- cookie的作用范围
- mysql学习之连接查询
- 1006. Tree Traversals - Hard Version (35)解题报告
- 程序员面试金典——解题总结: 9.17中等难题 17.1编写一个函数,不用临时变量,直接交换两个数
- r语言中时间函数处理
- 面向对象