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

UE4中鼠标左键按压触发开门脚本失效问题求助

解决UE4鼠标左键开门无反应的问题

看起来你在实现UE4开门功能时遇到了输入绑定没生效的问题,我来帮你梳理下核心问题点和修复方案:

1. 错误的父类继承

你的ADoorOpen继承自APawn,但门不是玩家操控的Pawn角色——默认情况下输入事件只会发送给当前玩家控制的Pawn,除非你特意把这个门设置为玩家的控制Pawn,否则它永远收不到输入信号。

解决办法:把父类改成AActor,这是UE中所有可放置场景物体的基类,更适合门这类可交互道具。

2. 无效的输入绑定方式

SetupPlayerInputComponent是Pawn类的专属初始化函数,AActor不会自动调用这个方法,所以你写的绑定代码根本没执行。

需要给Actor手动添加输入组件,并在BeginPlay中主动启用输入、完成绑定。

3. 调试信息显示时长过短

你原来的调试信息设置了0.f的显示时长,会瞬间消失,很难确认函数是否被触发,建议改成2.f或更长时间。


修复后的完整代码

OpenDoor.h

UCLASS()
class HOME_API ADoorOpen : public AActor
{
    GENERATED_BODY()
    
public:    
    ADoorOpen();

protected:
    virtual void BeginPlay() override;

public:    
    virtual void Tick(float DeltaTime) override;

    UPROPERTY()
    USceneComponent* Root;

    UPROPERTY(EditAnywhere)
    UStaticMeshComponent* Door;

    UPROPERTY(EditAnywhere, Category = "DoorOpen")
    float rotateValue;

    UPROPERTY(BlueprintReadOnly, Category = "DoorOpen")
    FRotator doorRotation;

    UPROPERTY(BlueprintReadOnly, Category = "DoorOpen")
    bool open;

    UFUNCTION(BlueprintCallable, Category = "DoorOpen")
    void OpenCloseDoor();

private:
    // 添加输入组件
    UPROPERTY()
    UInputComponent* InputComp;
};

OpenDoor.cpp

#include "DoorOpen.h"
#include "Engine.h"
#include "Components/InputComponent.h"

ADoorOpen::ADoorOpen()
{
    PrimaryActorTick.bCanEverTick = true;
    rotateValue = 0.0f;
    open = false;

    Root = CreateDefaultSubobject<USceneComponent>(TEXT("Root"));
    RootComponent = Root;

    Door = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Door"));
    Door->SetRelativeLocation(FVector(0.f, 50.f, -50.f));
    Door->SetupAttachment(RootComponent);

    // 初始化输入组件
    InputComp = CreateDefaultSubobject<UInputComponent>(TEXT("InputComponent"));
    InputComp->SetIsReplicated(false);
}

void ADoorOpen::BeginPlay()
{
    Super::BeginPlay();

    // 启用输入:获取第一玩家控制器并绑定输入
    EnableInput(GetWorld()->GetFirstPlayerController());

    // 绑定Fire动作到开门函数
    if (InputComp)
    {
        InputComp->BindAction("Fire", IE_Pressed, this, &ADoorOpen::OpenCloseDoor);
    }
}

void ADoorOpen::OpenCloseDoor()
{
    // 延长调试信息显示时间,确保能看到
    GEngine->AddOnScreenDebugMessage(-1, 2.f, FColor::Red, "OpenCloseDoor Triggered!");

    // 实现开门/关门逻辑(示例:绕Y轴旋转90度)
    if (!open)
    {
        Door->SetRelativeRotation(FRotator(0.f, 90.f, 0.f));
        open = true;
    }
    else
    {
        Door->SetRelativeRotation(FRotator::ZeroRotator);
        open = false;
    }
}

void ADoorOpen::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);
}

最后必做检查

  • 打开Project Settings > Input,确认Action Mappings中存在名为Fire的动作,并且已经绑定了Left Mouse Button(鼠标左键)。
  • 确保场景中的ADoorOpen实例已经正确放置,没有被禁用。

内容的提问来源于stack exchange,提问作者Amazing User

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:26:52