xLua基礎篇
前置工作:創建好空的Unity工程並導入xLua中的Asset文件夾 (xLua下載地址)
加載運行Lua代碼
在C#中使用xLua主要是通過XLua命名空間中的LuaEnv中的DoString去運行Lua代碼,如下圖所示:
再進一步,就是我們創建一個Resources文件夾,並在裏面創建一個HelloWorld.lua.txt文件(這裏後綴必須加上.txt才能讓Unity和xLua的loader識別),然後在腳本里面讀取這個文本文檔裏面的Lua代碼並在Unity中運行,如下圖所示:
當然,你也可以不放在Resources文件夾下,任意放到你喜歡的位置然後用IO讀取裏面的內容在運行,這部分不是這篇文章的重點,就不演示了。
上面的這種讀取方法其實還不是最合適的。最合適的用法應該是調用Lua的loader去讀取文件。因爲xLua配置了一個從Resources中讀取文件的loader,所以只要執行require語句,並傳入文件名,對應的loader就會找到這個文件並運行裏面的代碼。注意,文件名後綴必須是.txt,這裏在上面也有提到過。具體代碼如下:
既然提到Loader,那就肯定要學習自定義loader。其實所謂的自定義Loader就是一個CustomLoader的委託,只要創建對應簽名的方法,然後把這個方面作爲參數添加到LuaEnv中,xLua就會在執行“require”時自動調用這些loader,直到返回值不爲空爲止。
下面是例子,我寫了一個自己的loader,功能是從StreamingAssets這個文件夾中搜查讀取目標文本文檔,代碼如下:
C# Call Lua
獲取全局變量
一、獲取一個全局基本數據類型
訪問LuaEnv.Global就可以了,上面有個模版Get方法,可指定返回的類型。
luaenv.Global.Get(“a”)
luaenv.Global.Get(“b”)
luaenv.Global.Get(“c”)
二、獲取table類型對應到類和接口中
獲取一個table就相對要麻煩一些,因爲table可以被指定爲C#多種數據結構,可以作爲自定義的類去一一對應table的元素接受,也可以作爲一個接口然後同樣一一對應屬性去接受等。
對於用類或者接口去接受table,有幾點要注意:
- 類接收過來的變量是值拷貝,而接口則類似於引用拷貝。即是說,接收後,在類中對字段的修改不會修改到原來的Lua代碼,而接口的則可以
- 使用接口的接收依賴生成代碼,所以需要在給接口添加 [CSharpCallLua]特性
代碼如下:
這個是Lua文檔,方便對照參考:
這裏有一個地方要注意,當方法有參數時,第一個參數記得傳一個佔位參數代表是self,我這裏隨手寫了個arg,用self或者任意東西都可以,自己理解就行。缺少這個佔位參數,就會報錯。
然後就是C#代碼:
三、獲取table類型對應到Dictonary和List中
用這兩個數據結構去接受好處就是不需要創建新的數據結構,也比較簡單。不過有一些地方需要注意:
- table轉換到Dictionary後所有鍵值(如果有的話),都是string 類型的,所以如果含有多種類型的值,一般都需要用Dictionary<string,object>()去接受
- Dictionary是能接受含有鍵的值,List只接受沒有鍵的內容
- Dictionay和List都是,只接受自己聲明類型的對應的值。即List會把table裏的所有數字類型接收過來,不過要注意因爲Lua只有number數字類型,有可能造成精度丟失,如3.3轉換成int可能直接爲0
四、獲取全局function變量
1.委託
function在Lua中也是一種變量,因此也可以被接收,而C#雖然沒有對應的變量,卻可以用委託去接受。
對應的委託只要簽名相同即可。只需注意一點,Lua中的方法可以有多個返回值,那麼對應到C#中就要用out/ref參數去接受這些返回值。具體的自己試驗一下就好,並沒有什麼難度。代碼如下:
同時還要注意,在釋放LuaEnv之前,要把我們獲取到的委託引用清除掉才能執行lua.Dispose(),不然就會報錯。
2.LuaFunction
如果要獲取的方法調用不頻繁,可以直接用這個類去直接接收而省去新建一個delegate的繁瑣。不過這個方法性能損耗很大(還有上面沒有提到的LuaTable),慎用。
調用LuaFunction.Call()可以傳參,然後全部的返回值都會放到一個Object數組中,代碼如下:
Lua Call C#
Lua中調用C# 我個人覺得官方留的教程文檔就十分完善,所以我這裏就對照着文檔寫了一些簡單的調用例子並加上註釋來當做演示,請打開官方XLua教程文檔食用。
在那之前,我先提一下C#和Lua對於方法返回值和參數的不同處理。這裏我寫了一個對照樣式,先是原本的C#方法,然後再往下是對應的Lua方法,上圖:
首先看C# 方法,可以看到,該方法有2個常規參數,一個ref 參數,一個out參數,一個返回值。對應到Lua就是下圖的方法:
可以看到,在Lua中參數有3個,返回值也是3個。這是因爲在Lua中,C#的ref參數會同時被當做參數和返回值來處理;而out參數則不會被當做參數,僅僅當做返回值來對待。那麼,Lua中的三個返回值就分別對應C#方法中的常規返回值和按順序傳入的ref和out參數。
然後最後就是一點比較零碎的例子:
全篇完,希望有幫到正在學習或者複習的各位同學,謝謝閱讀!