Xlua实现热更新的一些细节上的操作

本文详细介绍了如何使用Xlua进行C#与Lua之间的交互,包括创建Lua运行环境、加载Lua脚本、执行Lua方法等。同时,文章探讨了Xlua的HotFix功能,讲解了启用热补丁的步骤以及如何在Lua中修改C#代码。此外,还讨论了在项目中实现非HotFix热更新的流程,涉及资源解析、Lua数据加载和代码逻辑替换。

如何使用Xlua进行热更新

这个问题应该是注重对Xlua的具体使用方案而非大致的热更新流程

下载和安装简单,直接跳过

Xlua加载lua脚本

首先要创建一个Lua的运行环境

private luaEnv luaenv;

luaenv = new LuaEnv();

1.执行字符串(不建议使用)

LuaEnv.DoString(string str);

传入的参数可以是字符串形式的lua脚本,也可以是lua的require("模块名")语句

2. 自定义Loader

//public delegate byte[] CustomLoader(ref string filepath);
//public void LuaEnv.AddLoader(CustomLoader loader)
private byte[] MyLoad(ref string filepath)
{
    print(filepath);   //输出了(Lua文件名):TextLua01
    //Lua文件路径
    string path = @"D:\Unity\MyProject\LearnLua\Assets\" + filepath + ".lua.txt";
    //读取文本
    string file = File.ReadAllText(path);
    //返回文本字节数组
    return Encoding.UTF8.GetBytes(file);
}
luaenv.AddLoader(MyLoader);

C# 端调用 Lua

DoString(“require(“main”)”)

这个方案需要在Lua端中有一个主入口Main脚本,这个脚本负责全局地处理Lua端所有方法调用。

加载完毕后,C#端通过如下代码执行lua端main模块中的Main方法

Xlua.Function func = luaenv.Global.Get<Xlua.Function>("Main");

func.Call();

这个方案为了管理需要再设置一个基本的LuaBehavior,其中包含脚本环境元表,然后再通过这个脚本环境元表去.Get()需要获取的的Lua方法。

//LuaBehavior基本结构
protected LuaTable ScriptEnv;
Action m_LuaAwake;
Action m_LuaUpdate;
Action m_LuaStart;


void Awake()
{
    LuaTable meta = luaEnv.NewTable();
    meta.Set("__index", luaEnv.Global);
    meta.Dispose();

    scriptEnv.Set("self",this)
    scriptEnv.Get("Awake", out m_LuaAwake);
    scriptEnv.Get("Start", out m_LuaStart);
    scriptEnv.Get("Update", out m_LuaUpdate);
    m_LuaAwake.Invoke();
}

void Start()
{
    m_LuaStart.Invoke();
}

void Update()
{
    m_LuaUpdate.Invoke();
}

Lua 端调用 C#

print("Let's start learning Lua!")

--new C#对象
--local newgo = CS.UnityEngine.GameObject()
local newgo2 = CS.UnityEngine.GameObject('helloworld')

--访问C#静态属性,方法
--如果需要经常访问的类,可以先用局部变量引用后访问
--除了减少敲代码的时间,还能提高性能
local go = CS.UnityEngine.GameObject
local ue=CS.UnityEngine

--读静态属性
--print(ue.Time.deltaTime)

--写静态属性
--ue.Time.timeScale = 0.5
--调用静态方法
--newgo3 = go.Find('helloworld')
--newgo3.name="NiHao"
newgo4 = go.find('Main Camera')
--调用成员方法,第一个参数需要传该对象,建议用冒号代替
--local cameracom = newgo4:GetComponent("Camera")
--go.Destroy(cameracom)


HotFix

通过Xlua能快速修复Lua代码的,Xlua插件中的功能。

开启热补丁:
首先需要在Unity中对HOTFIX__ENABLE进行自定义宏编译
操作:
打开, 依次查找或执行:

playersettings --> Inspector --> OtherSettings -->ScriptsingDefineSymbols --> 输入HOTFIX_ENABLE敲完按回车

编译完成后头部栏中的Xlua选项中多了一项(Hofix Inject In Editor)

C#脚本发生了任何更改都需要按选项Generate Code来生成代码,有问题就选项Clear Generate Code清楚脚本再重新生成,生成代码结束后会debug一个finished出来,此时再选项Hofix Inject In Editor进行注入

打开unity安装目录中的EditorDataManagedUnity.Cecil.Pdb.cll、Mdb.dll、.cll三个文件拷贝到工程目录下的xula文件夹下的src的editor文件夹下

如何使用lua代码对游戏内容进行更改?
在原来的可能出问题的C#类上打上hotfix标签,在方法上打上luacallcsharp标签

之后便可在lua脚本中进行更改, 使用描述如下

xlua.hotfix(class, [method_name], fix)

  • API描述 : 注入lua补丁
  • class : C#类,两种表示方法,CS.Namespace.TypeName或者字符串方式"Namespace.TypeName",字符串格式和C#的Type.GetType要求一致,如果是内嵌类型(Nested Type)是非Public类型的话,只能用字符串方式表示"Namespace.TypeName+NestedTypeName";
  • method_name : 方法名,可选;
  • fix : 如果传了method_name,fix将会是一个function,否则通过table提供一组函数。table的组织按key是method_name,value是function的方式。

Xlua与热更新的联系

这部分需要需要配合项目框架理解,一般来说项目框架会有一个AB包解析器,当框架自动完成打包/发布服务器/下载热更资源/解析热更资源的操作后,框架解析器会去项目自定义分配的资源目录(一般就那两个,StreamingAsset/PersistenceAsset),解析与Lua相关的AB包,然后存到一个Dictionay<string, byte[]>当中,然后在从这里面加载真正的lua数据并替换本地的代码逻辑,实现非HotFix下代码逻辑热更。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值