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

前几个月腾讯开源了一套热更新、热补丁解决方案,托管在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 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;

	}
}

本人也在寻找一份游戏开发实习工作,如果大佬们需要开发人员,请把我带走

这是我的简历:resume.liujunliang.com.cn/resume.pdf

作品的话可以私聊我哦!


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

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

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

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


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



你可能感兴趣的:(移动游戏开发,unity3d,Unity游戏开发)