不存储类类型<>

TSubclassOf<> isn't storing the class type

本文关键字:lt gt 类型 存储      更新时间:2023-10-16

我正在尝试创建一个激光束Actor,当玩家按下"Fire"动作映射时生成。我无法让 SuchclassOf<> 工作,以便我可以生成创建激光的演员。我可以声明变量并编译项目,但我似乎无法在项目的其他任何地方使用该模板,因为变量未初始化???我将包含我的代码来帮助解释正在发生的事情。

这是我的LaserTagCharacter.h文件。我已经声明了 LaserClass 变量,我可以毫无问题地编译这段代码。

#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()
TSubclassOf<class ALaserTagLaser> LaserClass;
protected:
// Called when player fires a laser beam
void OnFire();
};

转到 LaserTagCharacter.cpp 文件,我包含了一些调试代码和创建模板类的主要目标。我创建了模板类以在 SpawnActor 函数中使用它,该函数将生成 LaserTagLaser 的实例。

#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();
if (LaserClass)
{
UE_LOG(LogTemp, Warning, TEXT("Yes"))
}
else
{
UE_LOG(LogTemp, Warning, TEXT("No"))
}
World->SpawnActor<ALaserTagLaser>(LaserClass, SpawnLocation, SpawnRotation);
}

当我编译、播放和按"Fire"操作映射时,我从输出日志中得到的 2 条消息是:

日志温度: 警告: 否

和。。。

日志生成:

警告:生成演员失败,因为未指定任何类

如果您对我如何解决此问题并使 TSubclassOf<>正常工作有任何见解,那就太棒了!

你的代码看起来没问题,但你应该在头文件中添加一个 UPROPERTY 中的说明符,也许一个类别只是给它一个标题

UPROPERTY(EditDefaultsOnly, Category = "Setup")
TSubclassOf<class ALaserTagLaser> LaserClass;

TSubclassOf,这样UPROPERTY就可以在虚幻引擎的蓝图编辑器中作为下拉菜单进行编辑。然后,您必须根据ALaserTagLaser创建新蓝图。之后,打开下拉菜单,您将只看到ALaserTagLaser类的类和子类。选择您创建的蓝图,单击蓝图编辑器中的编译按钮,然后它应该可以工作了...