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
相关产品推荐
相关产品推荐

