Unity 使用xLua遇到的坑

本文讲述了在Unity使用xLua时遇到的事件委托释放问题,详细描述了当UI控件绑定事件后,如何确保在程序退出前正确释放委托以避免xLua抛出异常。作者探讨了尝试过的解决方案,包括直接置空事件、UnityEvent的内部优化导致的问题,最终提出通过再次调用Invoke()来清除执行中的调用列表,成功解决了问题。
摘要由CSDN通过智能技术生成

在我们使用xLua作为Unity中lua集成的解决方案时,遇到了一个问题,就是当我们使用在lua中把UI中的某个控件绑定相应的事件(如按钮的onClick事件),xLua绑定这个事件是用委托实现的,具体代码可以查看xLua的代码。而在程序退出的时候xLua会检查对应的委托有没有被正确的释放掉,如果没有释放掉的话就会抛出异常。代码如表所示:

 
复制代码
 1         public virtual void Dispose(bool dispose)
 2         {
 3 #if THREAD_SAFE || HOTFIX_ENABLE
 4             lock (luaEnvLock)
 5             {
 6 #endif
 7                 if (disposed) return;
 8                 Tick();
 9 
10                 if (!translator.AllDelegateBridgeReleased())
11                 {
12                     throw new InvalidOperationException("try to dispose a LuaEnv with C# callback!");
13                 }
14 
15                 LuaAPI.lua_close(L);
16 
17                 ObjectTranslatorPool.Instance.Remove(L);
18                 translator = null;
19 
20                 rawL = IntPtr.Zero;
21 
22                 disposed = true;
23 #if THREAD_SAFE || HOTFIX_ENABLE
24             }
25 #endif
26         }
复制代码

这说明我们并没有把对应的委托给释放掉。所以我们需要确保在程序退出之前所有的委托要正确地释放掉。方案大体如下,每一个UI都对应一个实例,这样在绑定控件的时候创建一个匿名函数,这个函数用于控件把这个控件绑定的事件清除掉,同时把这个匿名函数放到一个数组里面去,在这个UI销毁的时候调用一个函数&#

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值