浅谈xLua自定义Loader

发表于2017-05-08
评论0 5.9k浏览

前几个月腾讯开源了一套热更新、热补丁解决方案,托管在Github

最近抽出时间学习下,研究了下官方文档,受益颇深

之后准备录制一套视频教程来讲解xLua,录制完成后会将链接分享在这篇博文里


本文我来介绍xLua的自定义Loader

先介绍两种Lua文件加载方法

一.执行字符串方法

[csharp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. LuaEnv luaenv = new LuaEnv();  
  2.         luaenv.DoString("print('hello world')");  

二.执行Lua文件方法

[csharp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. LuaEnv luaenv = new LuaEnv();  
  2.         luaenv.DoString("require ('byfile')");  

其中byfile是文件名,存放在Resources文件下,以.lua.tex为后缀名


问题来了,require是怎样的执行过程?

实质上,require是一个个的调用Loader查找出匹配的Lua文件,然后执行该文件

在xLua中我们可以自定义添加Loader

[csharp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public delegate byte[] CustomLoader(ref string filepath);  
  2. public void LuaEnv.AddLoader(CustomLoader loader)  

通过AddLoader可以注册个回调,该回调参数是字符串,lua代码里头调用require时,参数将会透传给自定义回调函数和原生回调函数

回调中就可以根据require里的参数去加载指定文件。该回调返回值是一个byte数组,如果为空表示该loader找不到,否则返回lua文件的内容

以下代码是我自己模拟实现了一遍

[csharp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. using System.Collections;  
  2. using System.Collections.Generic;  
  3. using UnityEngine;  
  4. using XLua;  
  5.   
  6. public class SelfCustomLoader : MonoBehaviour {  
  7.   
  8.     private LuaEnv luaEvn = null;  
  9.   
  10.     // Use this for initialization  
  11.     void Start()  
  12.     {  
  13.         //创建lua解释器  
  14.         luaEvn = new LuaEnv();  
  15.   
  16.         LuaEnv.CustomLoader method = CustomLoaderMethod;  
  17.   
  18.         //添加自定义装载机Loader  
  19.         luaEvn.AddLoader(method);  
  20.   
  21.         //当在Lua代码里调用了request使,request里的参数将传给回调函数里的参数  
  22.         luaEvn.DoString(" require('Loader1') ");  
  23.         luaEvn.DoString(" print( require('Loader2').a )");  
  24.         luaEvn.DoString(" require('Loader3') ");  
  25.     }  
  26.   
  27.     // Update is called once per frame  
  28.     void Update()  
  29.     {  
  30.   
  31.     }  
  32.   
  33.     private byte[] CustomLoaderMethod(ref string fileName)  
  34.     {  
  35.         Debug.Log(fileName);  
  36.   
  37.         //找到指定文件  
  38.         if ("Loader1" == fileName)  
  39.         {  
  40.             string str = "print('Loader1>>>>>')";  
  41.             return System.Text.ASCIIEncoding.UTF8.GetBytes(str);  
  42.         }  
  43.         if ("Loader2" == fileName)  
  44.         {  
  45.             string str = "return {a=0}";  
  46.             return System.Text.ASCIIEncoding.UTF8.GetBytes(str);  
  47.         }  
  48.   
  49.         return null;  
  50.   
  51.     }  
  52. }  

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引