UE C++中GetOverlappingActors正确用法,关于ClassFilter

背景:

用到UE的自带函数GetOverlappingActors,检测碰撞框是否和NPC产生重叠,由于碰状框经常和许多东西重叠,直接检测会有不必要的对象被写入结果数组,浪费性能。函数中的第二个参数ClassFilter可以根据类型进行过滤,使不关注的类对象都被排除在外。

//引擎中该函数的声明
void UPrimitiveComponent::GetOverlappingActors(TArray<AActor*>& OutOverlappingActors, TSubclassOf<AActor> ClassFilter) const
问题:

根据各种地方的教程、外网的资料,ClassFilter中传入的参数都是TSubclassOf<>类型的,比如TSubclassOf<ABaseNpc>。可能大家的想法都是,希望过滤后得出来的对象既可以是目标类,也可以是目标类的子类。

可是在使用后,发现过滤并没有起作用,还是把重叠的所有Actor都查找出来了,没省下性能开销。
ClassFilter错误用法
比如截图中,明明传入的ClassFilter是TSubclassOf<ABaseNpc>(NPC的基类),可截图中的结果数组中,找出的都不是NPC,而是主角、怪物。

结果:

官方代码
查了下引擎里GetOverlappingActors的实现,函数里本来就会查找ClassFilter的子类,且IsA函数内只能传入StaticClass,所以很多网上写的用法不对,改成了StaticClass就正确了。
ClassFilter正确用法
这次运行就正确了,重叠物体只检测到了目标NPC

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值