xLua的安裝
首先從xLua的Github主頁上下載資源包
https://github.com/Tencent/xLua
解壓下載好的壓縮包,將壓縮包中Assets文件夾下的內容復制到Unity工程的Assets文件夾下即可
字符串加載
通過字符加載Lua代碼的方式如下
using UnityEngine;
using XLua;
public class XLuaLoad : MonoBehaviour
{
private LuaEnv luaenv;
void Start ()
{
luaenv = new LuaEnv();
object[] returns = luaenv.DoString
(
@"
print('load lua by string.')
return 1, 'hello'
"
);
Debug.Log("return value: " + returns[0] + " " + returns[1]);
}
void Update ()
{
if (luaenv != null)
{
luaenv.Tick();
}
}
void Destroy()
{
if (luaenv != null)
{
luaenv.Dispose();
}
}
}
將腳本掛載到任何一個游戲物體上,執行程序,可以得到
這里使用到了LuaEnv對象的DoString方法,該方法的定義如下
object[] DoString(string chunk, string chunkName = "chuck", LuaTable env = null)
-
描述:
執行一個代碼塊。
參數:
參數 | 說明 |
---|---|
chunk | Lua代碼字符串 |
chunkName | 發生error時的debug顯示信息中使用,指明某某代碼塊的某行錯誤 |
env | 這個代碼塊 |
- 返回值:
代碼塊里return語句的返回值
上面的代碼中我們執行了
object[] returns = luaenv.DoString
(
@"
print('load lua by string.')
return 1, 'hello'
"
);
DoString返回將包含兩個object, 一個是double類型的1, 一個是string類型的“hello”
加載Lua文件
新建一個lua文件,命名為my_script.lua,并向文件中寫入下列測試代碼
接下來將my_script.lua文件放到Resources文件夾下,修改my_script.lua文件的后綴名為txt
然后通過以下方式加載my_script.lua文件中的Lua代碼
using UnityEngine;
using XLua;
public class XLuaLoad : MonoBehaviour
{
private LuaEnv luaenv;
void Start ()
{
luaenv = new LuaEnv();
luaenv.DoString
(
@"
require 'my_script'
"
);
}
void Update ()
{
if (luaenv != null)
{
luaenv.Tick();
}
}
void Destroy()
{
if (luaenv != null)
{
luaenv.Dispose();
}
}
}
仍然是調用LuaEnv對象的DoString方法,不過這里通過使用Lua的全局函數require函數來加載其它的文件,在加載的時候會使用默認的Loader去加載文件
將腳本掛載到任何一個游戲物體上,執行程序,可以得到
使用上述方法加載Lua代碼時需要注意:
- Lua代碼文件的文件名必須是XXX.lua.txt的格式,通過require引入的文件的時候只需要傳入XXX
- Lua代碼文件必須放在Resources文件夾下,不能放在Resources下的某個文件夾里
如果沒有注意以上兩點,運行的時候就會拋出異常,提示找不到文件
如果想要把Lua代碼文件放在任意文件夾下的話,就需要使用AddLoader方法添加自定義的Loader
void AddLoader(CustomLoader loader)
描述
增加一個自定義loader參數:
參數 | 說明 |
---|---|
loader | 類型為delegate byte[] CustomLoader(ref string filepath) ,當一個文件被require時,這個loader會被回調其參數是require的參數,如果該loader找到文件,可以將其讀進內存,返回一個byte數組。如果需要支持調試的話,而filepath要設置成IDE能找到的路徑(相對或者絕對都可以) |
需要注意的是,require的參數是什么,loader在回調的時候filepath就會被設置為什么
只需要對上面的代碼進行略微修改即可
using UnityEngine;
using XLua;
public class XLuaLoad : MonoBehaviour
{
private LuaEnv luaenv;
void Start ()
{
luaenv = new LuaEnv();
luaenv.AddLoader(LuaLoader);
luaenv.DoString
(
@"
require 'lua/my_script'
"
);
}
private byte[] LuaLoader(ref string filepath)
{
TextAsset script = Resources.Load("lua/" + filepath + ".lua") as TextAsset;
return script.bytes;
}
void Update ()
{
if (luaenv != null)
{
luaenv.Tick();
}
}
void Destroy()
{
if (luaenv != null)
{
luaenv.Dispose();
}
}
}
在LuaLoader中可以使用任何方式來加載Lua代碼,只要最后返回代碼字符的byte數組即可
可以向LuaEnv中添加若干個Loader,在require的時候會依次調用每一個Loader,直到有一個Loader成功為止,如果全部失敗則會拋出異常,提示找不到文件
建議的加載Lua腳本方式是:整個程序就一個DoString("require 'main'"),然后在main.lua加載其它腳本(類似lua腳本的命令行執行:lua main.lua)