xlua入门(5)自定义Loader

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/NippyLi/article/details/80042819

xlua执行加载lua代码有两种

  • 执行字符串

    最基本是直接用LuaEnv.DoString执行一个字符串,当然,字符串得符合Lua语法
    比如:luaenv.DoString(“print(‘hello world’)”)
    xlua的使用文档上说这种方式并不建议。

  • 加载Lua文件

    用lua的require函数即可
    比如:DoString(“require ‘byfile’”)
    后面自定义Loader就与这个有关

  • 自定义Loader

    在xLua加自定义loader是很简单的,只涉及到一个接口:

public delegate byte[] CustomLoader(ref string filepath);
public void LuaEnv.AddLoader(CustomLoader loader);

通过AddLoader可以注册个回调,该回调参数是字符串,lua代码里头调用require时,参数将会透传给回调,回调中就可以根据这个参数去加载指定文件,如果需要支持调试,需要把filepath修改为真实路径传出。该回调返回值是一个byte数组,如果为空表示该loader找不到,否则则为lua文件的内容。

下面是根据官方提供的demo进行的测试代码

using UnityEngine;
using System.Collections;
using XLua;

public class CustomLoader : MonoBehaviour {
    LuaEnv luaenv = null;
    // Use this for initialization
    void Start()
    {

        //自定义loader
        //lua代码里头调用require时,参数将会透传给回调,回调中就可以根据这个参数去加载指定文件
        //回调返回值是一个byte数组,如果为空表示该loader找不到,否则则为lua文件的内容。
        // public delegate byte[] CustomLoader(ref string filepath);
        //public void LuaEnv.AddLoader(CustomLoader loader)


        luaenv = new LuaEnv();
        luaenv.AddLoader(CoutomLoaderMethod);
        luaenv.DoString("require 'loader1'");
        luaenv.DoString("require 'loader2'");
        luaenv.DoString("require 'loader3'");

        /*
        luaenv.AddLoader((ref string filename) => {
             if (filename == "InMemory")
             {
                 string script = "return {ccc = 9999}";
                 return System.Text.Encoding.UTF8.GetBytes(script);
             }
             return null;
         });
        luaenv.DoString("print('InMemory.ccc=', require('InMemory').ccc)");
        */
    }

    // Update is called once per frame
    void Update()
    {
        if (luaenv != null)
        {
            luaenv.Tick();
        }
    }


    public byte[] CoutomLoaderMethod(ref string file)
    {
        if(file == "loader1")
        {
            string str = "print('loader1===')";
            return System.Text.ASCIIEncoding.UTF8.GetBytes(str);
        }

        if(file == "loader2")
        {
            string str = "a = {b = 2}  print('loadr2 result is '.. a.b)";
            return System.Text.ASCIIEncoding.UTF8.GetBytes(str);
        }

        if(file == "loader3")
        {
            string str = "a = 3 print('loadr3 result is '.. a)";
            return System.Text.ASCIIEncoding.UTF8.GetBytes(str);
        }

        return null;
    }


    void OnDestroy()
    {
        luaenv.Dispose();
    }
}

猜你喜欢

转载自blog.csdn.net/NippyLi/article/details/80042819