ulua 调用module函数

Posted 饭后温柔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ulua 调用module函数相关的知识,希望对你有一定的参考价值。

项目使用ulua,我神烦这个东西。lua单纯在lua环境使用还好,他妈的一旦要跟外界交互,各种月经不调就来了。要记住贼他妈多的细节,你才能稍微处理好。一个破栈,pop来push去,位置一会在-1,一会在-3,你妈21世纪已经过去五分之一了好吗,谁乐意像汇编一样操作?那十几个操作函数,愣是比正则表达式规则还难记,用完就忘。我发现lua心智负担完全跟简洁搭不上边,贼他妈重,实现个面向对象都乱七八糟。我学c++都没觉得有什么不爽的,就lua代码各种不乐意看,各种小tips在那里,什么meta,weak,_G,逼着你记得各种trick,或者好听点,叫做元搭建。Fuck,怎么不去死。用lua这类小众语言就像用linux的工具,某种意义上,它们其实也容易形成一种壁垒,我管这叫他妈的细节地狱。老子想开车来场说走就走的旅行,你他妈的给我一袋工具,先组装一个自行车先,你是从清朝穿越来搞笑的吗?

 

哥哥只是想c#调个lua模拟的类,折腾的不得不去看细节,顺带又回忆了programing in lua 24-26章。lua遇到unity,就像王八遇到乌龟,真是极品配极品。unity单看是极好的,罪过罪过。

哇塞,戾气好重,还是先上代码吧。

以下2个函数分别添加到LuaScriptMgr和LuaFunction,就可以调用lua中实现的类似youmodule:overridefuck()的函数了。

   public object[] CallLuaModuleFunction(string name, params object[] args)
    {
        LuaBase lb = null;

        if (dict.TryGetValue(name, out lb))
        {
            LuaFunction func = lb as LuaFunction;
            return func.Call(args);
        }
        else
        {
            IntPtr L = lua.L;
            LuaFunction func = null;
            int oldTop = LuaDLL.lua_gettop(L);

            if (PushLuaMoudleFunction(L, name))
            {
                int reference = LuaDLL.luaL_ref(L, LuaIndexes.LUA_REGISTRYINDEX);
                func = new LuaFunction(reference, lua);
                LuaDLL.lua_settop(L, oldTop);
                object[] objs = func.CallMember(args);
                func.Dispose();
                return objs;
            }

            return null;
        }
    }
        internal object[] callmember(object[] args, Type[] returnTypes)
        {
            int nArgs = 0;
            LuaScriptMgr.PushTraceBack(L);
            int oldTop = LuaDLL.lua_gettop(L);

            if (!LuaDLL.lua_checkstack(L, args.Length + 6))
            {
                LuaDLL.lua_pop(L, 1);
                throw new LuaException("Lua stack overflow");
            }

            push(L);

            LuaDLL.lua_pushvalue(L, -3);  //乱七八糟: 推入this即函数所在的表本身,-1是函数,-2是错误处理函数,-3是函数所在的表

            if (args != null)
            {
                nArgs = args.Length;

                for (int i = 0; i < args.Length; i++)
                {
                    PushArgs(L, args[i]);
                }
            }

            int error = LuaDLL.lua_pcall(L, nArgs + 1, -1, -nArgs - 3);

            if (error != 0)
            {
                string err = LuaDLL.lua_tostring(L, -1);
                LuaDLL.lua_settop(L, oldTop - 1);
                if (err == null) err = "Unknown Lua Error";
                throw new LuaScriptException(err, "");
            }

            object[] ret = returnTypes != null ? translator.popValues(L, oldTop, returnTypes) : translator.popValues(L, oldTop);
            LuaDLL.lua_settop(L, oldTop - 1);
            return ret;
        }

心头火起,看完有用要点赞。

以上是关于ulua 调用module函数的主要内容,如果未能解决你的问题,请参考以下文章

自动生成ulua中使用的lua代码

uLua Unity工作机制

调用模板化成员函数:帮助我理解另一个 *** 帖子中的代码片段

php 一个自定义的try..catch包装器代码片段,用于执行模型函数,使其成为一个单行函数调用

Ulua&ToLua 调试

如何将数据从回收器适配器发送到片段 |如何从 recyclerview 适配器调用片段函数