c++ 为什么我不能创建一个TSubclassOf〈>用于SpawnActor()函数?

nsc4cvqm  于 2022-11-27  发布在  其他
关注(0)|答案(2)|浏览(419)

我正在UE4中制作一个激光标签游戏,我在使用TSubclassOf〈〉时遇到了很多困难。
首先,我在LaserTagCharacter.h文件中声明了LaserClass,我还创建了一个名为OnFire()的函数,当播放器使用“Fire”动作绑定时调用该函数。

#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "LaserTagCharacter.generated.h"

UCLASS()
class LASERTAG_API ALaserTagCharacter : public ACharacter
{
    GENERATED_BODY()

public:
    // Sets default values
    ALaserTagCharacter();

    UPROPERTY(VisibleAnywhere, Category = "Laser")
    TSubclassOf<class ALaserTagLaser> LaserClass;

protected:
    // Called when player fires a laser beam
    void OnFire();
};

现在我想实现我的OnFire()函数,使用SpawnActor〈〉函数从我的ALaserTagLaser类创建一个激光器。

#include "LaserTagCharacter.h"
#include "Camera/CameraComponent.h"
#include "Components/CapsuleComponent.h"
#include "Components/InputComponent.h"
#include "LaserTagLaser.h"
#include "Engine/World.h"

// Sets default values
ALaserTagCharacter::ALaserTagCharacter()
{

}

// Called when player uses fire action binding
void ALaserTagCharacter::OnFire()
{
    UWorld* World = GetWorld();
    FVector SpawnLocation = GetActorLocation();
    FRotator SpawnRotation = GetControlRotation();
    FActorSpawnParameters SpawnParameters;
    SpawnParameters.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn;

    World->SpawnActor<ALaserTagLaser>(LaserClass, GetActorLocation(), GetActorRotation(), SpawnParameters);
}

所有这些代码都可以编译,但是当我单击“播放”,打开输出日志,并使用“Fire”操作绑定时,我得到了这个错误。

LogSpawn: Warning: SpawnActor failed because no class was specified

我很困惑,因为我清楚地指定了我想成为什么职业。如果有人能提供一些见解,这将是真棒。

gfttwv5a

gfttwv5a1#

TSubclassOf就是一个UClass*。在你的代码中,你从来没有给它赋值。所以它总是LaserClass == nullptr
为了正确地生成参与者,需要将LaserClass变量分配给要使用的类。例如,如果要生成ALaserTagLaser,请在SpawnActor之前调用LaserClass = ALaserTagLaser::Static_Class()
如果你想给LaserClass分配一个BP类,那么在Unreal编辑器中设置它。为此,你需要在Blueprint图中用一个set LaserClass节点设置它,目标是ALaserTagCharacter的一个示例,或者在下拉列表的详细信息面板中选择ALaserTagCharacter的子类中的一个默认值。

ncecgwcz

ncecgwcz2#

您需要为LaserClass分配一个有效的类或子类。在您的BP中,您可以在详细信息面板中设置它。如果您不想像在BP中那样使用它,而总是想生成一个ALaserTagLaser,您可以只为SpawnActor提供一个类引用。

World->SpawnActor<ALaserTagLaser>(ALaserTagLaser::StaticClass(), GetActorLocation(), GetActorRotation(), SpawnParameters);

相关问题