XLua教程(一)Lua文件加載


Lua文件加載

  1. 執行字符串

    最基本是直接用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();
            // }
        }
    }
    
    

    但這種方式並不建議,更建議下面介紹這種方法。

  2. 加載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 可以滿足這些需求。

  3. 自定義 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'
    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM