ulua c#調用lua中模擬的類成員函數


項目使用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中實現的類似fuckmodule: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);

            bool error = false;

            
            int pos = name.LastIndexOf('.');

            if (pos > 0)
            {
                string tableName = name.Substring(0, pos);

                if (PushLuaTable(L, tableName))
                {
                    string funcName = name.Substring(pos + 1);
                    LuaDLL.lua_pushstring(L, funcName);
                    LuaDLL.lua_gettable(L, -2);
                }

                LuaTypes type = LuaDLL.lua_type(L, -1);

                if (type != LuaTypes.LUA_TFUNCTION)
                {
                    LuaDLL.lua_settop(L, oldTop);
                    error = true;
                }
            }
            else
            {
                LuaDLL.lua_getglobal(L, name);
                LuaTypes type = LuaDLL.lua_type(L, -1);

                if (type != LuaTypes.LUA_TFUNCTION)
                {
                    LuaDLL.lua_settop(L, oldTop);
                    error = true;
                }
            }

            if (!error)
            {
                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 - 2);
            return ret;
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM