Lua文件加載
-
執行字符串
最基本是直接用LuaEnv.DoString執行一個字符串,當然,字符串得符合Lua語法
比如:/* C# Code */ using UnityEngine; using System.Collections; using XLua; namespace Tutorial { public class ByString : MonoBehaviour { LuaEnv luaenv = null; // Use this for initialization void Start() { luaenv = new LuaEnv(); luaenv.DoString("print('hello world')"); } // void Update() // { // if (luaenv != null) // { // luaenv.Tick(); // } // } // void OnDestroy() // { // luaenv.Dispose(); // } } }
但這種方式並不建議,更建議下面介紹這種方法。
-
加載Lua文件
用lua的require函數即可
比如:/* C#Code */ using UnityEngine; using System.Collections; using XLua; namespace Tutorial { public class ByFile : MonoBehaviour { LuaEnv luaenv = null; void Start() { luaenv = new LuaEnv(); luaenv.DoString("require 'byfile'"); // 輸出 “hello world” } // void Update() // { // if (luaenv != null) // { // luaenv.Tick(); // } // } // void OnDestroy() // { // luaenv.Dispose(); // } } }
/* LuaCode */ // Resources/byfile.lua.txt // Resources只支持有限的后綴所以要加個其他后綴,如txt print('hello world')
require實際上是調一個個的loader去加載,有一個成功就不再往下嘗試,全失敗則報文件找不到。
目前 xLua 除了原生的 loader 外,還添加了從 Resource 加載的 loader,需要注意的是因為 Resource 只支持有限的后綴,放 Resources 下的 lua 文件得加上 txt 后綴。
建議的加載 Lua 腳本方式是:
整個程序就一個 DoString("require 'main'"),然后在 main.lua 加載其它腳本(效果類似 Lua 腳本的命令行執行: lua main.lua)。有童鞋會問:
要是我的 Lua 文件是下載回來的,或者某個自定義的文件格式里頭解壓出來,或者需要解密等等,怎么辦?
問得好,xLua 的自定義 Loader 可以滿足這些需求。 -
自定義 Loader
在 xLua 加自定義 loader 是很簡單的,只涉及到一個接口:
public delegate byte[] CustomLoader(ref string filepath); // LuaEnv.AddLoader(CustomLoader loader)
通過 AddLoader 可以注冊個回調,該回調參數是字符串,lua 代碼里頭調用 require 時,參數將會透傳給回調,回調中就可以根據這個參數去加載指定文件.
如果需要支持調試,需要把 filepath 修改為真實路徑傳出。該回調返回值是一個 byte 數組,如果為空表示該 loader 找不到,否則則為 lua 文件的內容。透傳消息,就是消息體格式及內容,對於傳遞的通道來說是不去過問的,通道只負責消息的傳遞,對消息不做任何處理,當客戶端接收到透傳消息后,由客戶端自己來決定如何處理消息。
有了這個就簡單了,用 IIPS 的 IFS?
沒問題。寫個 loader 調用 IIPS 的接口讀文件內容即可。文件已經加密?沒問題,自己寫 loader 讀取文件解密后返回即可。。。完整示例見
/* C# Code */ using UnityEngine; using XLua; public class ChangeHelloWorld : MonoBehaviour { LuaEnv luaEnv = null; void Start() { this.luaEnv = new LuaEnv(); // 1)使用 LuaEnv 的 AddLoader 添加一個回調函數 this.luaEnv.AddLoader(this.loadedLua); // 2)lua 中用 require 加載 lua 文件 // 3)lua 的 每一次require 操作不管是否成功都會觸發1的回調 this.luaEnv.DoString("require 'luaFile001'"); Debug.Log(this.luaEnv.Global.Get<string>("b")); // 輸出 bbbb Debug.Log(this.luaEnv.Global.Get<string>("c")); // 輸出 null,回調函數里覆蓋了lua的內容。c的賦值沒了。。 } /// <summary> /// 加載Lua腳本的回調 /// </summary> /// <param name="fileName">要加載的Lua腳本名字</param> /// <returns>加載到的Lua腳本</returns> byte[] loadedLua(ref string fileName) { if (fileName == "luaFile001") { string script = "b = 'bbbb'"; return System.Text.Encoding.UTF8.GetBytes(script); } return null; } // void Update() // { // if (luaEnv != null) // { // this.luaEnv.Tick(); // } // } // private void OnDestroy() // { // this.luaEnv.Dispose(); // } }
/* LuaCode */ c = 'cccc'