閱前提示
本系列為作者在學習框架與撰寫框架時的心得與筆記
適合人群:All
閱讀方式:工具文章
本系列會不斷更新,如果對你有所幫助,點贊收藏吧:)
文章目錄
- 閱前提示
- XLua
- 配置
- [LuaCallCSharp]
- [CSharpCallLua]
- 初始化
- 小節
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,逐兒時之夢正在游戲制作的技術海洋中漂泊,知道的越多,不知道的也越多,希望我的文章對你有所幫助:)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/243648.html
標籤:其他
上一篇:感謝有你,一路同行,歷史文章匯總,涉及STM32、模塊使用、傳感器、物聯網、鴻蒙、仿真和綜合實體等嵌入式的方方面面,歡迎關注。
