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

被折叠的 条评论
为什么被折叠?



