框架筆記:記錄XLua的簡單接入

閱前提示

本系列爲作者在學習框架與編寫框架時的心得與筆記
適合人羣: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語言APIToLua:逐行分析源碼,搞清楚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的坑,所以目前就不再這裏在多說太多啦。就作者來言,對比了ToLuaXLua我覺得在接入上面會舒服很多。(因爲二者我都接入了,因爲我希望我的框架HotScript部分能滿足所有的Lua使用者~)
推薦閱讀:XLua在Unity中的用法摘要


.
.
.
.
.




嗨,我是作者Vin129,逐兒時之夢正在遊戲製作的技術海洋中漂泊。知道的越多,不知道的也越多。希望我的文章對你有所幫助:)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章