日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

uLua Unity工作机制

發(fā)布時間:2024/1/17 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 uLua Unity工作机制 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?

基于ulua 1.25版本,開啟C#類型動態(tài)注冊.

一.? 步驟

  • 注冊需要Wrap的C#類型.
  •   在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

    二.? 需要注意的事情

  • 有些類在Wrap后會導(dǎo)致編譯錯誤,例如File類,因?yàn)閡lua在Wrap時不支持泛型<T>,一些用到泛型的函數(shù)Wrap后會出錯,還有其他一些方面會導(dǎo)致Wrap出的類型報錯,或者有一些類是經(jīng)過改造的,不能從原類型Wrap,這時,我們Wrap一次之后,修改Wrap后的文件以滿足我們的需要,解決編譯報錯,然后將該類型從WrapFile中_GT(typeof(XXX))刪除,不讓ulua在Wrap階段處理該類型,但是需要修改LuaBinder.cs和Wrap.lua的生成方式,保留該類型的相關(guān)代碼,以免影響該類型注冊到Lua的這一過程.
  • 有些類比如Image,其繼承了Graphic類的color屬性,如果Image是屬于第1點(diǎn)中提到的Wrap一次的類,那么也必須要對其基類Graphic進(jìn)行Wrap一次,否則Lua端會找不到Image繼承的color屬性.
  • 編譯LuaJit – 同一臺PC上如果安裝了多個版本的VS,可能會出現(xiàn)找不到kernel32庫的問題,嘗試用各個版本的命令行工具編譯.
  • 編譯ulua庫時,如果環(huán)境變量里有其他MinGW,有可能導(dǎo)致編譯失敗.需要先將環(huán)境變量include,lib,path改為ulua源碼編譯工具中帶的MinGW
  • 共同學(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。