unity遊戲開發之ULua框架介紹(一)

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 腳本文件了。

相關文章
相關標籤/搜索