ulua 調用module函數
阿新 • • 發佈:2017-06-22
out internal cnblogs logs style you 代碼 c# base
項目使用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函數