uLua Unity工作机制
?
基于ulua 1.25版本,開啟C#類型動態(tài)注冊.
一.? 步驟
在WrapFile.cs類中,使用_GT(typeof(XXX)), 注冊需要Wrap的C#類型
注冊的C#類型被包裝成BindType對象,在BindType構(gòu)造函數(shù)里獲取注冊類型的類名,注冊給Lua的名稱,基類名稱,Wrap的文件名稱等信息,并保存在相應(yīng)的BindType對象中.(這些是在WrapFile類創(chuàng)建時就生成的)
2. 執(zhí)行編輯器腳本,生成Wrap的C#類, LuaBinder類,以及Wrap.lua文件.
執(zhí)行編輯器腳本SimulatorRunScript,調(diào)用LuaBinding里的相關(guān)接口,LuaBinding里遍歷WrapFile中注冊的需要Wrap的C#類型,根據(jù)BindType里的信息,自動生成cs代碼文件,并且生成LuaBinder類和Wrap.lua文件.
3.以上是運(yùn)行前的準(zhǔn)備工作.點(diǎn)擊運(yùn)行按鈕,運(yùn)行項(xiàng)目
4.項(xiàng)目首先初始化LuaScriptMgr.cs類,該類初始化后會執(zhí)行Global.lua代碼.
Global.lua首先require Wrap.lua文件,執(zhí)行Wrap.lua文件中的代碼.
Wrap.lua是2步驟里生成的,其內(nèi)容是import各種C#類型到Lua,由于ulua支持動態(tài)注冊C#類型.該類默認(rèn)狀態(tài)下是import了所有的C#類型到Lua,可以根據(jù)性能需要,修改Wrap.lua的生成方式,減少其中不需要立刻import的類型,改為在首次使用時import.提高啟動效率.
通過import ‘XXX’ 可以把XXX類型注冊到Lua,其原理是在Lua.cs腳本里將import這一字段注冊到Lua的全局表中,并且將import綁定到C#中的LuaStatic.importWrap函數(shù),因此Lua端執(zhí)行import ‘XXX’之后,調(diào)用了C#的LuaStatic.importWrap函數(shù),該函數(shù)從Lua棧中取出棧頂?shù)腦XX類型名,并調(diào)用了LuaBinder的Bind函數(shù)
LuaBinder也是在第2步中生成的類,其作用是注冊1步驟Wrap的類型到Lua,該類Bind函數(shù),接收一個類型名,然后Switch該類型,得到該類型Wrap后的類,并調(diào)用Wrap類中的Register函數(shù),將該類型的相關(guān)方法注冊到Lua,以供Lua端調(diào)用.
各Wrap類的Register函數(shù)通過調(diào)用LuaScriptMgr.RegisterLib函數(shù),注冊到Lua,在RegisterLib函數(shù)里,為該類型的namespace的各級創(chuàng)建相應(yīng)table并注冊到Lua端,以免類型的namespace在Lua端無法找到.例如System.IO.File會創(chuàng)建System,IO的table,以及File類型的table
二.? 需要注意的事情
共同學(xué)習(xí),如有錯誤,請務(wù)必提出.
轉(zhuǎn)載請注明:http://www.cnblogs.com/xixidaguai/p/5556791.html
轉(zhuǎn)載于:https://www.cnblogs.com/wmalloc/p/5556791.html
總結(jié)
以上是生活随笔為你收集整理的uLua Unity工作机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 理解水平扩展和垂直扩展
- 下一篇: 九章算术卷第五 商功