ulua初識(一)
uLua與Unity交互
1.uLua文件夾結構
基礎介紹
SimpleFramework框架項目的核心是ulua,在Unity環境下使用ulua可以實現Lua腳本與Unity內C#腳本的交互,通過Lua腳本來操作Unity3d內的各種遊戲組件。
文件夾結構
1.Core:uLua核心
2.DocsLuLua文檔,其實就是LuaInterface的PDF文檔
3.Editor:uLua編輯器拓展
備註:項目內所有的Editor文件夾都是編輯器擴展文件夾,並不局限於根目錄
4.Example:uLua自帶演示案例
5.Source:cstolua核心目錄
2.uLua環境下的代碼交互
基礎介紹
在前面的課程中在VS2015使用過LuaInterface項目中的兩個DLL文件來實現C#與Lua的交互,而在ulua環境下本質也是通過LuaInterface來實現Lua與C#的交互,但是ulua對LuaInterface進行了二次封裝,所以在代碼書寫上和原生lua稍有不同
2.C#代碼中執行Lua代碼
using System.Collections; using System.Collections.Generic; using UnityEngine; using LuaInterface; public class LuaForUnity : MonoBehaviour { void Start () { LuaState luaState = new LuaState(); //創建Lua解析器對象 luaState.DoString("print(‘Hello Unity‘)"); } }
1.同樣需要在C#中引入LuaInterface
2.原生的lua解析器對象被封裝成了LuaState
3.LuaState類存在的位置是uLua/Core/Lua.cs
3.通過lua在Unity創建遊戲對象
Lua代碼中操作Unity內的類[反射方式/原生方式]
private string str = @" 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)) ";
LuaState luaState = new LuaState(); //創建Lua解析器對象
luaState.DoString(str);
說明
1>這種方式是我們之前在VS環境下演示的方式
2>luanet已結被封裝到LuaInteface的命名空間內,所以我們可以直接在lua代碼中使用luanet這個對象;
3>在Lua環境內操作C#中的類創建對象,不要寫new關鍵字
4>在Lua環境內操作C#中類創建的對象,訪問對象中的方法使用:
player:AddComponent(luanet.ctype(BoxCollider))
5>這種"反射方式"在項目開發中並不常用,但也有用武之地,真正大量使用的是wrap方式
4.Lua代碼中操作Unity內的類
Wrap方式
private string str2 = @" luanet.load_assembly(‘UnityEngine‘) GameObject = UnityEngine.GameObject BoxCollider = UnityEngine.BoxCollider Animator = UnityEngine.Animator local player = GameObject(‘MKCode‘) player:AddComponent(BoxCollider.GetClassType()) player:AddComponent(Animator.GetClassType())
LuaScriptMgr lua = new LuaScriptMgr(); lua.Start(); lua.DoString(str2);
說明:
1.這種方式是ulua開發過程中最常用的方式
2.Wrap方式實現Lua調用C#,依賴的是之前生成的LuaWrap文件;
也就是我們通過Gen Lua Wrap File菜單自動生成到ulua\Source\LuaWrap下的腳本文件
首先清除Clear LuaBind File+Gen Lua Wrap FIle
3.當時用Wrap
方式時,運行Lua代碼需要使用[LuaScriptMgr]
4.需要把APPConst.cs腳本中的DebugMode修改為true(否則報三個error)
5.包裝新的Wrap腳本
當我們用Lua的Wrap方式訪問Unity腳本組件,如果這些腳本沒有自動生成“xxxxWrap”,項目運行後就會報錯
比如Animator腳本,Quatertion,Vector3就沒有默認生成
遇到這種情況就需要前往ulua\Editor\WrapFile.cs腳本使用_GT(typeof(Animator)),
加載
ulua初識(一)