找回密码
 立即注册
查看: 254|回复: 0

xlua热更记录

[复制链接]
发表于 2023-4-10 19:21 | 显示全部楼层 |阅读模式
1、 Lua doString error: XLua.LuaException: xlua.access, no field __Hotfix0_ForwardReset
  1. [LuaScriptMdl][xLua] Lua doString error: XLua.LuaException: xlua.access, no field __Hotfix0_ForwardReset
  2. stack traceback:[C]:in field 'access'
  3.         xluasrc:98:in field 'hotfix'
  4.         Lua/xlua/util:112:in function 'Lua.xlua.util.hotfix_ex'
  5.         Lua_GameFramework:10:in method 'InitHotfix'
  6.         Lua_GameMain:91:in method 'ReloadScript'
  7.         [string""]:1:in main chunk
  8.   LuaEnv.cs:442
  9.   LuaEnv.cs:275
  10.   LuaEnv.cs:289
  11.   LuaScriptMdl.cs:569
复制代码
解决方法: ClearGenerated Code => Generated Code => Hotfix Inject In Editor 重新注入一遍
2、lambda表达式在xlua中的写法
c#
  1. ()=>{ mUIMgr.CloseDialog(Type);}
复制代码
xlua
  1. function a()
  2.         local f2 = function ()
  3.                 self.mUIMgr:CloseDialog(Type)
  4.         end
  5. end
  6. function a()
  7.         functionf2()
  8.                 self.mUIMgr:CloseDialog(Type)
  9.         end
  10. end
复制代码
(会被检测出模块泄露的风险,但是暂时还没遇到泄露的情况)
3、xlua实现委托
xlua委托的官方Github链接link.
C#
  1. publicclassTestClass{publicvoidOnClickBtn(Object a){}}publicdelegatevoidVoidDelegate(int a);
复制代码
xlua
  1. --把C#的函数赋值给一个委托字段
  2. (参数含义是个人理解,欢迎指正)
  3. --CS.VoidDelegate:publicdelegatevoidVoidDelegate(int a);--obj:Event delegate's target object.(事件委托的目标对象);静态方法这里填nil
  4. --CS.TestClass:类名
  5. --OnClickBtn:方法名
  6. --{typeof(CS.System.Object)}:OnClickBtn方法参数类型
  7. local func3 = util.createdelegate(CS.VoidDelegate , obj, CS.TestClass, 'OnClickBtn',{typeof(CS.System.Object)})-- description: 直接用C#函数创建delegate
  8. local functioncreatedelegate(delegate_cls, obj, impl_cls, method_name, parameter_type_list)local flag =enum_or_op_ex(CS.System.Reflection.BindingFlags.Public, CS.System.Reflection.BindingFlags.NonPublic,
  9.         CS.System.Reflection.BindingFlags.Instance, CS.System.Reflection.BindingFlags.Static)local m = parameter_type_list andtypeof(impl_cls):GetMethod(method_name, flag, nil, parameter_type_list, nil)ortypeof(impl_cls):GetMethod(method_name, flag)return CS.System.Delegate.CreateDelegate(typeof(delegate_cls), obj, m)
  10. end
复制代码
4、xlua重写的C#方法的参数中带有委托
c#
  1. //声明AddTimer(float,bool,Delegate d);//调用
  2. T.AddTimer(0.7f,false, PlayEffect);
复制代码
xlua
  1. functiona()
  2.         local delegate= function ()
  3.                 self:PlayEffect()
  4.         end
  5.         self.mTimerMdl:AddTimer(0.7,false,delegate)
  6. end
复制代码
5、xlua调用的C#方法是扩展方法的
xlua不能像c#一样通过实例去调用,只能像调用静态方法一样调用,命名空间.类名.方法
c#
  1. //方法namespaceK{classL{AddTimer(this GameObject,string);}}//调用this.gameobject.AddTimer(string);
复制代码
xlua
  1. functiona()
  2.         CS.K.L.AddTimer(GameObject,string);
  3. end
复制代码
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-6 02:55 , Processed in 0.088393 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表