xlua入门(5)自定义Loader

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();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值