背景:
用到UE的自带函数GetOverlappingActors
,检测碰撞框是否和NPC产生重叠,由于碰状框经常和许多东西重叠,直接检测会有不必要的对象被写入结果数组,浪费性能。函数中的第二个参数ClassFilter可以根据类型进行过滤,使不关注的类对象都被排除在外。
//引擎中该函数的声明
void UPrimitiveComponent::GetOverlappingActors(TArray<AActor*>& OutOverlappingActors, TSubclassOf<AActor> ClassFilter) const
问题:
根据各种地方的教程、外网的资料,ClassFilter中传入的参数都是TSubclassOf<>
类型的,比如TSubclassOf<ABaseNpc>
。可能大家的想法都是,希望过滤后得出来的对象既可以是目标类,也可以是目标类的子类。
可是在使用后,发现过滤并没有起作用,还是把重叠的所有Actor都查找出来了,没省下性能开销。
比如截图中,明明传入的ClassFilter是TSubclassOf<ABaseNpc>
(NPC的基类),可截图中的结果数组中,找出的都不是NPC,而是主角、怪物。
结果:
查了下引擎里GetOverlappingActors
的实现,函数里本来就会查找ClassFilter的子类,且IsA
函数内只能传入StaticClass,所以很多网上写的用法不对,改成了StaticClass就正确了。
这次运行就正确了,重叠物体只检测到了目标NPC