c++ 如何在Actor构造函数中使用EditAnywhere变量

zpgglvta  于 2023-05-08  发布在  其他
关注(0)|答案(2)|浏览(117)

在一个宇宙飞船类中,我有一个变量float CameraHeight,它定义了相机应该在网格上方创建多高。
我想在Blueprint(基于C类)中设置这个变量,这样我就可以 * 选择最佳值 *。但是,当我从Blueprint更改此变量时,相机不会更改其位置。我相信这是因为构造函数只在创建对象时被调用,当我试图改变蓝图中的变量时,它已经创建,尽管我不知道如何解决这个问题。
是否有可能在C
constructor中将相机高度设置为一个变量,但只能在稍后的蓝图中初始化该变量的值?

ASpaceship.h

UCLASS()
class SPACESHIPSHOOTER_API ASpaceship : public ACharacter
{
    GENERATED_BODY()

public:
    ASpaceship();

protected:
    virtual void BeginPlay() override;

public: 
    // Called every frame
    virtual void Tick(float DeltaTime) override;

    // Called to bind functionality to input
    virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;

    UPROPERTY(EditAnywhere)
    float CameraHeight; // This variable

    UPROPERTY(EditDefaultsOnly)
    USkeletalMeshComponent* MeshComponent;

    UPROPERTY()
    UCameraComponent* CameraComponent;

    UFUNCTION()
    void MoveForward(float value);

    UFUNCTION()
    void MoveRight(float value);

};

ASpaceship.cpp constructor

ASpaceship::ASpaceship()
{
    // Set this character to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
    PrimaryActorTick.bCanEverTick = true;

    MeshComponent = GetMesh();

    CameraComponent = CreateDefaultSubobject<UCameraComponent>(TEXT("CameraComponent"));
    CameraComponent->SetupAttachment(MeshComponent);
    CameraComponent->SetRelativeLocation(FVector(0.0f, 0.0f, CameraHeight)); // Here I try to set the camera position with a variable
    CameraComponent->bUsePawnControlRotation = true;
}
ukqbszuj

ukqbszuj1#

在C++中,你可以有一个“构造脚本”功能,它将响应你在蓝图中设置的任何值,如果你添加以下覆盖:

//.h
virtual void OnConstruction(const FTransform& Transform) override;

//.cpp
AYourActorClass::OnConstruction(const FTransform& Transform) {
   Super::OnConstruction(Transform);
   // Do whatever you want with the camera
}

唯一重要的是,在你的蓝图的构造脚本中,你需要调用父构造脚本。如果没有看到它的节点,请右键单击构造脚本节点,然后选择“添加对父函数的调用”。

ylamdve6

ylamdve62#

正如@goose_lake所说,这是使用OnConstruction函数的一个选项。但请记住,这是在Blueprint的组件创建和注册之后调用的,因此如果您想更改一些BP数据,它将不起作用。如果它不起作用,你可以在蓝图中使用UserConstructionScript。它是BlueprintImplementableEvent,所以之前被称为。

相关问题