浅谈腾讯热更新开源框架xLua自定义Loader

来源:互联网 发布:it职业技术学校 编辑:程序博客网 时间:2024/05/31 13:16

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

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


本文我来介绍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 initializationvoid Start(){//创建lua解释器luaEvn = new LuaEnv();LuaEnv.CustomLoader method = CustomLoaderMethod;//添加自定义装载机LoaderluaEvn.AddLoader(method);//当在Lua代码里调用了request使,request里的参数将传给回调函数里的参数luaEvn.DoString(" require('Loader1') ");luaEvn.DoString(" print( require('Loader2').a )");luaEvn.DoString(" require('Loader3') ");}// Update is called once per framevoid 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;}}


==================== 即步 CSDN博客专栏=================

博客地址:http://blog.liujunliang.com.cn  

个人网站:http://www.liujunliang.com.cn     

==================== battle for programming =============


欢迎转载,转载注明出处!!!



1 0
原创粉丝点击