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

如何在Unreal Engine 5 C++代码中为Actor挂载Scene Component

在UE5.1(Manjaro Linux)中用C++挂载组件并实现跨类调用

一、在Door1 Actor中创建并挂载DoorSceneComponent

直接在Door1的C++类中完成组件的声明、初始化与挂载:

1. Door1.h 头文件

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "DoorSceneComponent.h"
#include "Door1.generated.h"

UCLASS()
class YOUR_PROJECT_NAME_API ADoor1 : public AActor
{
    GENERATED_BODY()
    
public:    
    ADoor1();

    // 公开组件引用,允许外部类访问
    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Door")
    UDoorSceneComponent* DoorComp;

protected:
    virtual void BeginPlay() override;
};

2. Door1.cpp 实现文件

#include "Door1.h"
#include "DoorSceneComponent.h"

ADoor1::ADoor1()
{
    PrimaryActorTick.bCanEverTick = false;

    // 初始化根组件(如果Actor无默认根组件)
    if (!RootComponent)
    {
        RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("RootComp"));
    }

    // 创建DoorSceneComponent实例并挂载到根组件
    DoorComp = CreateDefaultSubobject<UDoorSceneComponent>(TEXT("DoorSceneComp"));
    DoorComp->AttachToComponent(RootComponent, FAttachmentTransformRules::KeepRelativeTransform);
}

void ADoor1::BeginPlay()
{
    Super::BeginPlay();
}

二、在PlayerCharacter中调用DoorSceneComponent的成员

通过Door1的引用直接访问其挂载的组件,调用目标函数或变量:

1. PlayerCharacter.h 头文件

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "Door1.h"
#include "PlayerCharacter.generated.h"

UCLASS()
class YOUR_PROJECT_NAME_API APlayerCharacter : public ACharacter
{
    GENERATED_BODY()

public:
    APlayerCharacter();

    // 示例:设置当前交互的Door1引用
    UFUNCTION(BlueprintCallable, Category = "Door Interaction")
    void SetTargetDoor(ADoor1* TargetDoor);

protected:
    virtual void BeginPlay() override;

private:
    // 存储Door1的引用
    ADoor1* CurrentDoor;
};

2. PlayerCharacter.cpp 实现文件

#include "PlayerCharacter.h"

APlayerCharacter::APlayerCharacter()
{
    PrimaryActorTick.bCanEverTick = true;
    CurrentDoor = nullptr;
}

void APlayerCharacter::BeginPlay()
{
    Super::BeginPlay();
}

void APlayerCharacter::SetTargetDoor(ADoor1* TargetDoor)
{
    CurrentDoor = TargetDoor;
    if (CurrentDoor && CurrentDoor->DoorComp)
    {
        // 调用DoorSceneComponent的自定义函数(示例:OpenDoor)
        CurrentDoor->DoorComp->OpenDoor();
        // 访问DoorSceneComponent的成员变量(示例:bIsDoorOpen)
        bool IsDoorOpen = CurrentDoor->DoorComp->bIsDoorOpen;
    }
}

关键注意事项

  • 确保DoorSceneComponent中的目标函数和变量为public权限,或通过UFUNCTION(BlueprintCallable)、UPROPERTY(BlueprintReadWrite)标记,否则外部类无法访问。
  • 若需运行时动态挂载组件,可使用NewObject<UDoorSceneComponent>(this)创建实例,再调用AttachToComponent完成挂载,注意传递正确的FAttachmentTransformRules。
  • Manjaro Linux下编译时,需在项目Build.cs文件中添加DoorSceneComponent所在模块的依赖,避免编译错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 13:35:04