1. 首先在项目导入Xlua,只需要下载得Xlua包里面得Assets 文件夹下得内容拷贝到自己的项目中即可。 在里面有xlua的各种功能的范例。
2.现在开始xlua的第一步,
加入宏定义
3. 每次当c#代码改变的时候需要执行以下操作
第一个重新生成代码,第二步是注入热更。
4. 运行范例里面的HotfixTest场景,点击按钮,Debug会提示Lua调用,表示热更更新成功,环境已经OK。 如果有提示报错,就是没有导入工具。 从下载的Xlua的Tools文件夹也拷贝到自己的项目的相同目录下即可
5. 然后开始自己的代码测试。创建新场景,创景脚本HotfixLuaScripts.CS 作为Lua调用的总入口。通常对于Lua的调用都在一个统一的脚本中,既方便了管理,也降低了内存的占用。
代码如下:
using UnityEngine;
using XLua;
using System.IO;
public class HotfixLuaScripts : MonoBehaviour
{
private LuaEnv LuaEnv;
private void Awake()
{
LuaEnv = new LuaEnv();
LuaEnv.AddLoader(MyLoader);
LuaEnv.DoString(@"require 'test'");
}
public byte[] MyLoader(ref string filePath)
{
string luaPath = Path.Combine(Application.dataPath, "Scripts/Lua/", filePath+".lua.txt");
Debug.Log(luaPath);
return System.Text.Encoding.UTF8.GetBytes(File.ReadAllText(luaPath));
}
// Update is called once per frame
void Update()
{
}
private void OnDisable()
{
LuaEnv.DoString(@"require 'LuaDispose'");
}
private void OnDestroy()
{
LuaEnv.Dispose();
}
}
总共使用了两个Lua脚本。
Test为测试,LuaDispose为释放在热更过程中,lua引用过的C#的热更内容。如果不进行释放,会出现报错. AddLoader 为自己定义加载的lua基本,可以选择自己想要存放的目录
搭建简单的场景来演示。 放一个Cube,创建如下脚本
using UnityEngine;
using XLua;
[Hotfix]
public class CubeController : MonoBehaviour
{
private new Rigidbody rigidbody;
// Start is called before the first frame update
void Start()
{
rigidbody = GetComponent<Rigidbody>();
}
[LuaCallCSharp]
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.P))
{
rigidbody.AddForce(Vector3.up*500);
}
}
}
需要热更的类要加 [Hotfix] 热更的方法需要加 [LuaCallCSharp] [LuaCallCSharp]
我在Test.lua.txt中进行热更的代码,如下
local UnityEngine=CS.UnityEngine
xlua.hotfix(CS.CubeController,'Update',function(self)
if(UnityEngine.Input.GetKeyDown(UnityEngine.KeyCode.S)) then
self.rigidbody:AddForce(UnityEngine.Vector3.up*500);
end
end)
6. 然后运行就会发现,代码会调用Test.lua.txt的内容,而CubeController 的Update方法不会被调用。 热更实现。
注意事项: lua的脚本需要保存UTF-8格式,后缀要改成".lua.txt "