閱前提示
本系列爲作者在學習框架與編寫框架時的心得與筆記
適合人羣:All
閱讀方式:工具文章
本系列會不斷更新,如果對你有所幫助,點贊收藏吧:)
XLua
XLua的快速使用正如它的文檔中所描述的那樣,僅僅三行就完事了~
XLua.LuaEnv luaenv = new XLua.LuaEnv();
luaenv.DoString("CS.UnityEngine.Debug.Log('hello world')");
luaenv.Dispose();
接下來就是如何將這三行所包含的內容接入到我們的工程框架中了。
配置
在使用Unity做開發的過程中,多多少少在用到Lua時會需要和C#進行一些數據交互。在XLua中,無論是[LuaCallCSharp]還是[CSharpCallLua]用到的一個方式:Wrap。
Wrap,可以理解成**“包裝”**。比如 我們想要在Lua中獲取Unity中的一個GameObject,那我們Lua中的代碼基本上會寫成如下的形式
local gameObject = CS.UnityEngine.GameObject.Find("name")
可以看出,這基本上和我們在C#端的書寫方式並沒有什麼差別,但實際上他們的原理卻很不一樣。
很明顯的一點,lua的數據類型根本無法支持GameObject,所以我們引入了Wrap。無論使用XLua還是ToLua,在初始化的過程中必不可少的是將我們可能需要使用到的C#類、方法包裝起來,以便在Lua中可以相對應的進行數據傳遞。當我們在Lua中需要調用C#的方法時,將通過入棧出棧的方式將 “數據” 進行傳遞(注:這裏的數據是經過處理的每個Object的Id),最終完成Lua與C#的數據交互。
更多詳細的理解可閱讀:Lua C語言API、ToLua:逐行分析源碼,搞清楚Wrap文件原理
[LuaCallCSharp]
講到着,大致是說清楚了我們在配置什麼了… 根據自身的需求將需要在Lua中被調用的東西都配置好。
[LuaCallCSharp]
public static List<Type> LuaCallCSharp = new List<Type>()
{
typeof(Component),
typeof(Transform),
typeof(Rigidbody),
typeof(Behaviour),
typeof(MonoBehaviour),
typeof(GameObject),
typeof(Time),
typeof(Texture),
typeof(Texture2D),
typeof(Shader),
typeof(Renderer),
typeof(Screen),
typeof(AudioClip),
...
typeof(自定義...),
}
[CSharpCallLua]
當然,也可以配置C#直接調用Lua的callback,着一般會配合LuaCallCSharp中的具體方法來使用。具體配置代碼XLua中也提供了參考這裏代碼太長了就不再放出了。
初始化
配置說完後,我們就可以針對一開始提及的三行代碼進行初始化了。
-
XLua.LuaEnv luaenv = new XLua.LuaEnv();
啓動XLua,創建LuaEnv實例,這裏面會做XLua初始化的工作,其中就包含了Wrap配置中的內容。
-
luaenv.DoString("CS.UnityEngine.Debug.Log('hello world')");
加載Lua腳本,XLua提供了DoString()提供了兩種方式:string/byte[] ,實際上最終都是變爲byte[]。
用例中的該方式比較直接,適合用來做簡單的性測使用,一般項目中並不會這麼用。
XLua提供了luaenv.AddLoader(CustomLoader loader) 方法,讓我們自定義加載腳本的加載器。
public delegate byte[] CustomLoader(ref string filepath);
只需定義一個返回值爲 byte[] 的方法即可。
-
luaenv.Dispose();
Dispose就過多介紹了,在關閉的時候當然是需要對其進行釋放的~
這樣,XLua的接入就已經算是初步完成了。以下是作者框架中的相關代碼
//初始化
public override void Init()
{
//創建實例
mLuaEnv = new LuaEnv();
//添加加載器
mLuaEnv.AddLoader(XLuaLoader);
var enterFile = LuaEnterFile;
//加載Lua第一個腳本
mLuaEnv.DoString(XLuaLoader(ref enterFile));
...
}
//加載器
public byte[] XLuaLoader(ref string fileName)
{
//正式的加載交由資源管理模塊來進行加載
#if XLua_VASSET || !UNITY_EDITOR
if(!fileName.EndsWith(".lua"))
fileName += ".lua";
return VAsset.Instance.LoadScriptFile(fileName);
#elif UNITY_EDITOR
//簡單粗暴的加載方式:)
string filePath = string.Empty;
var name = fileName.Replace(".lua","");
mSearchPaths.ForEach(value=>{
if(File.Exists(value.Replace("?",name)))
{
filePath = value.Replace("?",name);
return;
}
});
if(filePath.IsEmptyOrNull())
return null;
return File.ReadAllBytes(filePath);
#endif
}
小節
因爲作者目前還處於緩慢地擼框架階段,所以對於XLua的使用並沒有很深入的瞭解,也沒有淌過XLua的坑,所以目前就不再這裏在多說太多啦。就作者來言,對比了ToLua,XLua我覺得在接入上面會舒服很多。(因爲二者我都接入了,因爲我希望我的框架HotScript部分能滿足所有的Lua使用者~)
推薦閱讀:XLua在Unity中的用法摘要
.
.
.
.
.
嗨,我是作者Vin129,逐兒時之夢正在遊戲製作的技術海洋中漂泊。知道的越多,不知道的也越多。希望我的文章對你有所幫助:)