文章目录
1.lua无法自动注入C#程序集
PlayerSetting里的Scripting Define Symbol里设置为HOTFIX_ENABLE(宏)
2.[CSharpCallLua]无法编译
接口类或委托类必须设为public才能编译
3.无法打包成功的坑
删除Example文件,再clear->gen->hotfix
4.定义myLoader
private byte[] MyLoader(ref string path)
{
string absPath;
absPath = Application.streamingAssetsPath+"/"+path+".lua.txt";
return System.Text.Encoding.UTF8.GetBytes(File.ReadAllText(absPath));
}
5.LuaEnv释放时的bug
//新建一个lua文件用于释放,在luaenv释放前
private void OnDisable()
{
lua.DoString("require 'Dispose'");
}
//lua文件内容
xlua.hotfix(CS.CreateEmpty,'CreateCube',nil)
6.对类的私有成员进行修改的坑
需要加上xlua.private_accessible(CS.类名)
7.方法调用的坑
静态方法直接可以.()调用,普通方法调用要传自己如.(self)
8.补丁运行顺序坑
将LuaEnv声明为全局唯一的静态变量,并在所有逻辑前最先调用
9.只修改函数里部分变量
//将xlua的util文件引入自己lua的同级文件下,并声明对象引用
local util=require 'util'
xlua.private_accessible(CS.Rotate)
//用这个引用对象的hotfix_ex方法可以运行C# 脚本里的代码再修改
util.hotfix_ex(CS.Rotate,'Start',function(self)
self.Start(self)
self.rotateSpeed=550
end)
10.Invoke是谁调用的
当前类。即this.Invoke,转lua时是self.Invoke
11.lua没有泛型
如GetCoponent(),转lua是GetComponent(“xxx”)
12.从Web上拉lua
private void GetLua()
{
StartCoroutine(GetLuaFromWeb("HotFix"));
StartCoroutine(GetLuaFromWeb("Dispose"));
}
IEnumerator GetLuaFromWeb(string luaName)
{
//www加载方式
//string uri = @"file:///D:\Unity_WorkSpace\XLuaLearn\AssetBundles\longcube.ab";
string uri = @"http://localhost/" + luaName + ".lua.txt";
UnityWebRequest request = UnityWebRequest.Get(uri);
yield return request.SendWebRequest();
string luaText = request.downloadHandler.text;
string luaWritePath = Application.streamingAssetsPath + "\\" + luaName + ".lua.txt";
File.WriteAllText(luaWritePath, luaText);
}
13.luaEnv
void CreateLuaEnv()
{
lua = new LuaEnv();
lua.AddLoader(MyLoader);
lua.DoString("require 'HotFix'");
}