xLua入門基礎
環境配置
xLua是騰訊開發,據說比較先進;
下載下來后將Plugins和XLua文件夾考進項目;
Plugins多平台權限;XLua和C#交互;
test.lua文件中只寫了一句print(Hello LittlePerilla)
;
運行Lua代碼
運行xLua代碼需要創建lua解釋器,結束要釋放解釋器;
DoString是將字符串當成lua代碼執行;
//lua解釋器
LuaEnv luaenv = new XLua.LuaEnv();
//運行lua代碼,字符串當lua代碼執行;
luaenv.DoString("print('hello world!')");
//釋放解釋器
luaenv.Dispose();
運行C#代碼
CS.為xLua中調用C#代碼的關鍵字;
LuaEnv luaenv = new XLua.LuaEnv();
//運行lua代碼,字符串當lua代碼執行;
luaenv.DoString("CS.UnityEngine.Debug.Log('hello world')");
luaenv.Dispose();
返回值
LuaEnv luaenv = new XLua.LuaEnv();
object[] data = luaenv.DoString("return 100, false");
Debug.Log($"{data[0]}__{data[1]}");
luaenv.Dispose();
自定義加載器
默認加載器路徑為:steamingAssets;
LuaEnv luaenv = new LuaEnv();
//加載test.lua,這里的require是從默認加載器:steamingAssets中加載
luaenv.DoString("require('test')");
luaenv.Dispose();
自定義加載路徑:
所有的lua腳本都放在Assets同級目錄:DataPath\Lua;
xLua解釋器中AddLoader方法;參數是一個委托;
public delegate byte[] CustomLoader(ref string filepath);
filepath這個path就是require(path)的參數;
通過委托返回.lua文件中所有的代碼字節數據,提供給解釋器調用;
public void MyLoader()
{
LuaEnv luaenv = new LuaEnv();
//自定義加載器,加入xlua的解析路徑
//public delegate byte[] CustomLoader(ref string filepath);
luaenv.AddLoader(ProjectLoader);
luaenv.DoString("require('test')");
luaenv.Dispose();
}
//自定義加載器先於系統加載器;
//未加載到文件,返回空;
public byte[] ProjectLoader(ref string filepath)
{
string path = Application.dataPath;
path = path.Substring(0, path.Length - 6) + "DataPath/Lua/" + filepath + ".lua";
//讀取文件為字節數組
if(File.Exists(path))
return File.ReadAllBytes(path);
else
{
Debug.Log("未找到路徑文件");
return null;
}
}
xLua解釋器單例
LuaEnv在全局只能有一個,頻繁創建和釋放會造成性能浪費,因此寫成單例,封裝一些方法;
單例中包括私有方法——自定義加載器路徑;
供外部調用方法:
Free——釋放解釋器
DoString——調用Lua代碼
Gobal——獲取Lua全局參數
public class XluaEnv
{
#region LuaEnv Singleton
private static XluaEnv instance;
private XluaEnv()
{
luaEnv = new LuaEnv();
luaEnv.AddLoader(ProjectLoader);
}
public static XluaEnv I
{
get
{
if (instance == null)
instance = new XluaEnv();
return instance;
}
}
#endregion
#region LuaLoader
private LuaEnv luaEnv;
private byte[] ProjectLoader(ref string filepath)
{
string path = Application.dataPath;
path = path.Substring(0, path.Length - 6) + "DataPath/Lua/" + filepath + ".lua";
//讀取文件為字節數組
if(File.Exists(path))
return File.ReadAllBytes(path);
else
{
Debug.Log("未找到路徑文件");
return null;
}
}
#endregion
#region Public Function
public void Free()
{
luaEnv.Dispose();
instance = null;
}
public object[] DoString(string fileName)
{
return luaEnv.DoString($"require('{fileName}')");
}
public LuaTable Golbal()
{
return luaEnv.Global;
}
#endregion
}