zl程序教程

您现在的位置是:首页 >  其他

当前栏目

Unity Lua 之 在 Unity中 通过 自定义加载器MyLoader进行文件加载,读取执行文件中的 lua 内容,实现 Hello Lua

文件执行 实现 进行 通过 自定义 加载 内容
2023-09-11 14:20:50 时间

Unity Lua 之 在 Unity中 通过 自定义加载器MyLoader进行文件加载,读取执行文件中的 lua 内容,实现 Hello Lua

 

目录

Unity Lua 之 在 Unity中 通过 自定义加载器MyLoader进行文件加载,读取执行文件中的 lua 内容,实现 Hello Lua

一、简单介绍

二、自定义Loader

三、实现步骤

四、关键代码


 

一、简单介绍

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();

    }
}