UE4开发记录-重叠事件(Overlap)的执行次数问题

最近在做一个如图所示的demo,大概逻辑是通过椭圆来生成一切金币,然后当前方的box撞击(重叠)到路上的圆环时,就把他变成自己圆环队列中的一个,插在对应的空档里。

逻辑很简单,很快就写完了重叠事件,如图所示:

大概逻辑是:

Overlap->判断是否是金币->是金币->计算生成点后在圆环上生成一个新的->销毁碰撞到的金币->移除存储点坐标用的数组的头元素

执行后,移动物体到重叠位置直接ue4崩溃报错,错误代码:

 ue4 Unhandled Exception: EXCEPTION_ACCESS_VIOLATION reading address 0x0000000000000288

 当时百思不得其解,因为最初程序能够正常运行,但是下楼抽根烟回来就开始报错了。经过排查找到了UE4的crash日志,位置在 工程目录/Saved/Crashes/ 下。日志显示如下(只截取报错部分):

[2021.12.21-09.28.04:310][258]LogScript: Warning: Script Msg: Attempted to remove an item from an invalid index from array LocationSaveTemp [0/0]!

[2021.12.21-09.28.04:310][258]PIE: Error: Blueprint Runtime Error: "Attempted to access BP_SMcoin_C_86 via property K2Node_ComponentBoundEvent_OtherActor, but BP_SMcoin_C_86 is pending kill". Blueprint:  BP_HelixBuilder Function:  Execute Ubergraph BP Helix Builder Graph:  EventGraph Node:  DestroyActor

一共有两条报错,大概意思就是:

数组已经是空了,你还在Remove index 0,不合法

Actor已经被线程杀死了,再杀我找不着了

这时候才反应过来,应该是Overlap事件看似瞬间发生,瞬间删除,但是这一瞬间执行了n多次直接给我数组全remove了,因此线程和内存都报错了。

修改方法:加Do Once节点,如下图所示:

这样可以严格控制每次重叠只执行一次后续的任务和函数操作,避免发生抖动。

相关原理可以查一下嵌入式开发中的防抖问题:

按键消抖_百度百科

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值