UE中绑定到角色的Handgun Actor无法与墙体、其他Actor碰撞问题求助
问题原因及解决方案
核心原因1:碰撞预设通道响应不匹配
你使用的BlockAllDynamic预设默认仅对动态物体类型(如敌方Character)开启Block响应,对静态物体通道(BSP、静态网格体墙体均属于该类)的响应默认设为Ignore/Overlap,所以只会阻挡动态角色,不会阻挡静态场景物体。
核心原因2:挂载操作覆盖了蓝图预设的碰撞配置
AttachToComponent接口执行时,UE会默认将子Actor的碰撞配置向父组件对齐,你蓝图里预设的碰撞参数会在挂载后被重置,导致自定义配置失效。
修复步骤
- 首先修改BP_Handgun的碰撞预设:将预设改为
BlockAll,或者手动在碰撞详细设置里,把「静态世界(Static World)」通道的响应改为Block,确保所有物体类型都被阻挡。 - 在挂载代码后强制重设碰撞参数,避免挂载操作覆盖配置,修改后的代码如下:
void AMainCharacter::BeginPlay() { Super::BeginPlay(); check(GEngine != nullptr); Handgun = GetWorld()->SpawnActor<AHandgun>(HandgunClass); Handgun->AttachToComponent(GetMesh(), FAttachmentTransformRules::KeepRelativeTransform, TEXT("WeaponSocket")); Handgun->SetOwner(this); // 追加以下代码,强制重设碰撞属性 if(IsValid(Handgun)) { UPrimitiveComponent* HandgunCollision = Cast<UPrimitiveComponent>(Handgun->GetRootComponent()); if(IsValid(HandgunCollision)) { HandgunCollision->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics); HandgunCollision->SetCollisionProfileName(TEXT("BlockAll")); // 不需要和自身角色碰撞可开启以下配置 HandgunCollision->IgnoreActorWhenMoving(this, true); } } }
- 如果调整后仍然无效,检查MainCharacter的Movement组件设置,确认没有勾选「忽略附属于自身的Actor碰撞」相关选项。
内容的提问来源于stack exchange,提问作者George_H
相关产品推荐
相关产品推荐

