這篇文章將為大家詳細(xì)講解有關(guān)在ToLua框架中如何使用C#與Lua,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。
創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括安圖網(wǎng)站建設(shè)、安圖網(wǎng)站制作、安圖網(wǎng)頁制作以及安圖網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,安圖網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到安圖省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!Lua是目前國內(nèi)使用最多的熱更語言,基于Lua的熱更框架也非常多,最近學(xué)習(xí)了一下ToLua的熱更框架,主要使用的問題在于C#和Lua之間的互調(diào),因此做一下學(xué)習(xí)記錄以備后查。
所謂“互調(diào)”,當(dāng)然要包括兩個方面,一是通過C#調(diào)用Lua代碼,二是通過Lua代碼調(diào)用C#腳本,第二點(diǎn)還包括注冊在C#腳本里的Unity物體。
ToLua框架主要是通過靜態(tài)綁定來實(shí)現(xiàn)C#與Lua之間的交互的,基本原理是通過建立一個Lua虛擬機(jī)來映射C#腳本,然后再通過這個虛擬機(jī)來運(yùn)行Lua腳本,Lua腳本在運(yùn)行時(shí)可以通過虛擬機(jī)反過來調(diào)用C#腳本里注冊過的物體,這種方式的優(yōu)勢在于比起使用反射的uLua來說效率更高。
ToLua框架下可以將實(shí)現(xiàn)分成三大部分:普通的Unity+C#部分、ToLua虛擬機(jī)部分和Lua腳本部分,結(jié)構(gòu)見下圖:
ToLua結(jié)構(gòu)
目前國內(nèi)需要熱更的手游一般都將主要的邏輯框架和組件功能用C#實(shí)現(xiàn),而具體功能和調(diào)用放在Lua中,因?yàn)镃#是不能被打包進(jìn)AssetBundle中的,所以無法通過AssetBundle對代碼進(jìn)行改動,但是Lua是即時(shí)編譯型語言,并且可以被打包進(jìn)入AssetBundle中,在需要修改簡單功能時(shí),將Lua代碼通過AssetBundle進(jìn)行更新即可。
首先是下載地址:
ToLua
這是作者的github地址,進(jìn)入以后點(diǎn)擊下載Zip,完成后解壓到自己需要的目錄,再用Unity打開即可。
點(diǎn)擊下載zip即可
第一次打開工程時(shí)會提示是否需要自動生成注冊文件,新手可以選擇直接生成,若選擇了取消,也可以在編輯器菜單中手動注冊。——這是一個非常重要的操作,后文也會提到。
下面開始關(guān)于使用的正文。
前面有提到過ToLua的基本實(shí)現(xiàn)方式,這里可以再細(xì)化一點(diǎn):創(chuàng)建虛擬機(jī)——綁定數(shù)據(jù)——調(diào)用Lua代碼,這套步驟在框架自帶的Example里也非常清晰。
首先脫離Example實(shí)現(xiàn)一下這三個步驟。
ToLua虛擬機(jī)的創(chuàng)建非常簡單,只需要new一個LuaState即可,我們建立一個C#腳本作為入口,引用LuaInterface命名空間,輸入以下代碼,將文件掛載到場景中的一個空物體上即可。
using LuaInterface; using UnityEngine; public class LuaScene : MonoBehaviour { string luaString = @" print('這是一個使用DoString的Lua程序') "; string luaFile = "LuaStudy"; LuaState state; void Start() { state = new LuaState();//建立Lua虛擬機(jī) state.Start();//啟動虛擬機(jī) //使用string調(diào)用Lua state.DoString(luaString); //使用文件調(diào)用Lua //手動添加一個lua文件搜索地址 string sceneFile = Application.dataPath + "/LuaStudy"; state.AddSearchPath(sceneFile); state.DoFile(luaFile); state.Require(luaFile); state.Dispose();//使用完畢回收虛擬機(jī) Debug.LogFormat("當(dāng)前虛擬機(jī)狀態(tài):{0}", null == state);//驗(yàn)證虛擬機(jī)狀態(tài) } }