You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 02:06:03