浅谈xLua自定义Loader
发表于2017-05-08
前几个月腾讯开源了一套热更新、热补丁解决方案,托管在Github
最近抽出时间学习下,研究了下官方文档,受益颇深
之后准备录制一套视频教程来讲解xLua,录制完成后会将链接分享在这篇博文里
本文我来介绍xLua的自定义Loader
先介绍两种Lua文件加载方法
一.执行字符串方法
- LuaEnv luaenv = new LuaEnv();
- luaenv.DoString("print('hello world')");
二.执行Lua文件方法
- LuaEnv luaenv = new LuaEnv();
- luaenv.DoString("require ('byfile')");
其中byfile是文件名,存放在Resources文件下,以.lua.tex为后缀名
问题来了,require是怎样的执行过程?
实质上,require是一个个的调用Loader查找出匹配的Lua文件,然后执行该文件
在xLua中我们可以自定义添加Loader
- public delegate byte[] CustomLoader(ref string filepath);
- public void LuaEnv.AddLoader(CustomLoader loader)
通过AddLoader可以注册个回调,该回调参数是字符串,lua代码里头调用require时,参数将会透传给自定义回调函数和原生回调函数
回调中就可以根据require里的参数去加载指定文件。该回调返回值是一个byte数组,如果为空表示该loader找不到,否则返回lua文件的内容
以下代码是我自己模拟实现了一遍
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using XLua;
- public class SelfCustomLoader : MonoBehaviour {
- private LuaEnv luaEvn = null;
- // Use this for initialization
- void Start()
- {
- //创建lua解释器
- luaEvn = new LuaEnv();
- LuaEnv.CustomLoader method = CustomLoaderMethod;
- //添加自定义装载机Loader
- luaEvn.AddLoader(method);
- //当在Lua代码里调用了request使,request里的参数将传给回调函数里的参数
- luaEvn.DoString(" require('Loader1') ");
- luaEvn.DoString(" print( require('Loader2').a )");
- luaEvn.DoString(" require('Loader3') ");
- }
- // Update is called once per frame
- void Update()
- {
- }
- private byte[] CustomLoaderMethod(ref string fileName)
- {
- Debug.Log(fileName);
- //找到指定文件
- if ("Loader1" == fileName)
- {
- string str = "print('Loader1>>>>>')";
- return System.Text.ASCIIEncoding.UTF8.GetBytes(str);
- }
- if ("Loader2" == fileName)
- {
- string str = "return {a=0}";
- return System.Text.ASCIIEncoding.UTF8.GetBytes(str);
- }
- return null;
- }
- }