1.基礎介紹框架
①ULua 集成開發環境叫作:SimpleFramework,SimpleFramework 分爲NGUI 和UGUI兩個版本,區別是NGUI 版本的框架資源中含有NGUI 這個插件。SimpleFramework 自己不是Unitypackage 格式,而是一個Unity3D的項目工程,能夠用Unity 直接打開。編輯器
②SimpleFramework 和ULuaide
SimpleFramework > ULua > Luaui
ULua 是對原生Lua 環境進行了一次「包裝」,用於知足Unity 環境下的熱更新需求。爲了更方便的使用,因而又對ULua 進行「二次包裝」,包裝成了一個框架:SimpleFramework。lua
2. SimpleFramework框架資源結構spa
(1)六個根文件夾插件
①Examples:SimpleFramework 熱更新案例;對象
②Lua:SimpleFramework 框架自帶的Lua 源碼文件(咱們本身寫的Lua 腳本也是存放在Lua 文件夾中);遊戲
③NGUI:當你需用更高版本的NGUI 時,替換便可,不然不須要碰;ip
④Plugins:uLua 運行所依賴的底層庫文件,不須要碰;
⑤Scripts:SimpleFramework 自帶的C#腳本文件;
⑥uLua:uLua 所有代碼。
備註:uLua:④ ⑥ SimpleFramework:① ② ⑤ ngui:③
(2)框架自帶菜單命令
Lua 菜單:uLua 環境相關處理命令;
Game 菜單:用於打包不一樣平臺的AssetBundle 文件。
(3)框架使用步驟
Lua 菜單-->Welcome Screen 該窗口展現了框架的使用步驟。
<1>Lua-->Gen Lua Wrap File [生成Wrap 文件(必備操做)]
該命令用於生成「Lua 包裝文件」,存放在uLua\Source\LuaWrap 目錄下。該文件夾下所有是C#腳本,這些腳本文件的名稱特色是:腳本名+ Wrap;
Wrap 文件介紹:
該文件夾下的腳本對Unity 內經常使用組件腳本的二次包裝,Lua 環境運行後,會,把這些Wrap 文件加載到Lua 運行環境(Lua 虛擬機)中,最終的效果就是:Lua 調用Wrap 文件,Wrap 文件調用C#,來實現Lua 調用C#。生成Wrap 文件的目的是爲了提升Lua 的執行效率。
<2>Game-->Build xxxx [生成不一樣平臺的AssetBundle 資源(必備操做)]
Game-->Build Windows Resource 生成Windows 平臺下的AB 文件。生成後的AB 會存放到StreamingAssets 文件夾下。在生成的過程當中同時還會把Lua 文件夾下的全部腳本拷貝到該目錄,存放到lua 文件夾下。
(4)Lua 文件夾結構分析
SimpleFramework 框架自帶的Lua 源碼文件。
①3rd:第三方的Lua 腳本插件;
②Common:公共Lua 文件目錄;
③Controller:控制器目錄;
④Logic:管理器目錄;
⑤System:cstolua 的系統目錄;
⑥View:視圖層目錄。
3.uLua 文件夾結構
uLua是SimpleFramework 框架項目的核心,在Unity 環境下使用uLua能夠實現Lua 腳本與Unity 內C#腳本的交互,經過Lua 腳原本操做Unity3D內的各類遊戲組件。
①Core:uLua 核心;
②Docs:uLua 文檔,其實就是LuaInterface 的PDF 使用文檔;
③Editor:uLua 編輯器擴展(項目內全部的Editor 文件夾都是編輯器擴展文件夾,並不侷限於根目錄);
④Examples:uLua 自帶演示案例;
⑤Source:cstolua 核心目錄。
4.uLua 環境下的代碼交互
(1)基礎介紹
你們都知道可使用LuaInterface 項目中的兩個DLL 文件來實現C#與Lua 的交互。而在uLua 環境下本質也是經過LuaInterface 來實現Lua 與C#語言交互的。可是uLua 對LuaInterface 進行了二次的封裝,因此在代碼書寫上和原生的會稍有不一樣。
(2)C#代碼中執行Lua 代碼
LuaState lua = new LuaState();
lua.DoString("print('Hello World Monkey')");
說明:
<1>一樣須要在C#代碼中引入LuaInterface;
<2>原生的Lua 解析器對象「Lua」被二次封裝成了「
<3>LuaState 類存在的位置是:uLua\Core\Lua.cs。
(3)Lua 代碼中操做Unity 內的類[反射方式/ 原生方式]
演示:經過Lua 代碼在Unity 環境內建立一個遊戲物體。
luanet.load_assembly('UnityEngine')
GameObject = luanet.import_type('UnityEngine.GameObject')
BoxCollider = luanet.import_type('UnityEngine.BoxCollider')
local player = GameObject('Monkey')
player:AddComponent(luanet.ctype(BoxCollider))
說明:
<1>這種方式就是咱們提到的原生方式;
<2>luanet 已經被封裝到了LuaInterface 命名空間內,因此咱們能夠在Lua代碼中直接使用luanet 這個對象;
<3>在Lua 環境內操做C#中的類建立對象,不要寫new 關鍵字!!!
<4>在Lua 環境內操做C#中的類建立對象,訪問對象中的方法使用分號(:);
<5>這種「反射方式」在項目開發中並不經常使用,可是也有用武之地,真正大量使用的是下方的Wrap 方式。
(4)Lua 代碼中操做Unity 內的類[Wrap 方式]
luanet.load_assembly('UnityEngine')
GameObject = UnityEngine.GameObject
BoxCollider = UnityEngine.BoxCollider
local player = GameObject('Monkey')
player:AddComponent(BoxCollider.GetClassType())
LuaScriptMgr lua = new LuaScriptMgr();
lua.Start();
說明:
<1>這種是在uLua 開發過程當中最經常使用的方式,95%+狀況都是使用這種方式;
<2>Wrap 方式實現Lua 調用C#,依賴的是以前生成的LuaWrap 文件(也就是經過菜單自動生成到uLua\Source\LuaWrap 下的腳本文件);
<3>當使用Wrap 方式時,運行Lua 代碼須要使用LuaScriptMgr;
<4>須要把AppConst.cs 腳本中的的DebugMode 修改成true。
5.包裝新的Wrap 腳本
當咱們用Lua 的Wrap 方式訪問Unity 中的組件腳本,或者本身寫的腳本的使用,若是這些腳本沒有自動生成「xxxxWrap」,項目運行後,就會報錯。
好比Animator 腳本,就沒有默認生成Wrap 格式的文件。遇到這種狀況,咱們就須要往框架的Wrap 生成器中添加咱們要處理的新的類。
步驟以下:
①找到uLua\Editor\WrapFile.cs 打開該腳本,
使用該格式進行添加:_GT(typeof(類名)) ;
②Lua-->Clear LuaBinder File + Wrap File 清空原有的Wrap 文件;
③Lua-->Gen Lua Wrap Files 從新生成Wrap 文件;
這樣就能看的新增的Wrap 腳本文件了。