Unity Lua 之 在 Unity中 通过 自定义加载器MyLoader进行文件加载,读取执行文件中的 lua 内容,实现 Hello Lua
Unity Lua 之 在 Unity中 通过 自定义加载器MyLoader进行文件加载,读取执行文件中的 lua 内容,实现 Hello Lua
目录
Unity Lua 之 在 Unity中 通过 自定义加载器MyLoader进行文件加载,读取执行文件中的 lua 内容,实现 Hello Lua
一、简单介绍
Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
xLua为Unity、 .Net、 Mono等C#环境增加Lua脚本编程的能力,借助xLua,这些Lua代码可以方便的和C#相互调用。
xLua在功能、性能、易用性都有不少突破,这几方面分别最具代表性的是:
-
可以运行时把C#实现(方法,操作符,属性,事件等等)替换成lua实现;
-
出色的GC优化,自定义struct,枚举在Lua和C#间传递无C# gc alloc;
-
编辑器下无需生成代码,开发更轻量;
在Unity中使用xlua 的重要一个原因就是热更新,我们本着这个歌目的开始我们的学习。
本节介绍,如何自定义一个加载器MyLoader 读取执行文件中的 lua 内容,实现 Hello Lua。为加载服务器上的lua文件,实现热更新的挺关键一步哈。
二、自定义Loader
在xLua加自定义loader是很简单的,只涉及到一个接口:
public delegate byte[] CustomLoader(ref string filepath);
public void LuaEnv.AddLoader(CustomLoader loader)
通过AddLoader可以注册个回调,该回调参数是字符串,lua代码里头调用require时,参数将会透传给回调,回调中就可以根据这个参数去加载指定文件,如果需要支持调试,需要把filepath修改为真实路径传出。该回调返回值是一个byte数组,如果为空表示该loader找不到,否则则为lua文件的内容。 有了这个就简单了,用IIPS的IFS?没问题。写个loader调用IIPS的接口读文件内容即可。文件已经加密?没问题,自己写loader读取文件解密后返回即可
三、实现步骤
1、新建一个文本文件 HelloLuaByFile.lua.txt
2、打开编写 lua 代码
3、新建 Unity 工程,新建一个 LuaTxt 文件夹,并把 文本文件 HelloLuaByFile.lua.txt 导入
4、新建脚本,读取该路径下的 lua.txt 文件
5、脚本添加到环境中
6、运行场景,输入 Hello Lua
四、关键代码
using System.IO;
using System.Text;
using UnityEngine;
using XLua;
public class MyLoaderHelloLuaByFile : MonoBehaviour
{
// Lua 环境变量
LuaEnv luaEnv;
// Start is called before the first frame update
void Start()
{
LuaInit();
// Lua 添加自定义加载器 (require实际上是调一个个的loader去加载,有一个成功就不再往下尝试,全失败则报文件找不到。)
luaEnv.AddLoader(MyLoader);
luaEnv.DoString("require'HelloLuaByFile'");
}
/// <summary>
/// 自定义路径文件加载器
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
private byte[] MyLoader(ref string filePath) {
string path = Path.Combine(
Path.Combine(Application.dataPath,
"MyLoaderHelloLuaByFile/LuaTxt"),
filePath+".lua.txt");
Debug.Log(path);
return Encoding.UTF8.GetBytes(File.ReadAllText(path));
}
/// <summary>
/// Lua 环境初始化
/// </summary>
private void LuaInit() {
luaEnv = new LuaEnv();
}
/// <summary>
/// Lua 环境释放
/// </summary>
private void LuaDispose()
{
luaEnv.Dispose();
}
}
相关文章
- Android执行时ART载入OAT文件的过程分析
- 在Visual Studio 中使用git——文件管理-上(四)
- mysql中如何在命令行中,执行一个SQL脚本文件?
- 【XCP学习】A2L文件简介
- 删除一个目录下部分类型之外的所有文件的三种方法
- Linux 执行ThinkPHP 文件的计划任务
- 漏洞情报 | Fancy Product Designer插件未授权文件上传和远程代码执行漏洞(CVE-2021-24370)
- 用python导出csv文件
- 隐藏执行批处理bat文件
- base64编码文件下载
- 在html文件中运行php代码
- Property工具类,Properties文件工具类,PropertiesUtils工具类
- Python 当前执行文件路径拆分和拼接
- Python Excel自动化之 如何根据某一列快速对比两excel文件不同并输出不同内容
- 一、文件文件
- python编程之处理GB级的大型文件
- gdb可以查询执行文件的宏, 但是查询不了o文件的宏
- Git_忽略特殊文件
- selenium之批量执行测试用例生成HTML结果文件
- Windows Server 2008使用计划任务每天定时执行vbs文件
- sqlcmd执行文件夹下所有文件
- git 撤销对最后一个提交中某个文件的更改
- 定时删除日志文件---linux定时清理日志
- 如何 Windows Server 2008 R2通过计划任务定时执行bat文件,定时备份数据库数据
- cmd 搜索文件