【问题标题】:Why can't I create a TSubclassOf<> to use in a SpawnActor() function?为什么我不能创建 TSubclassOf<> 以在 SpawnActor() 函数中使用?
【发布时间】:2020-04-22 12:07:46
【问题描述】:

我正在 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

我很困惑,因为我明确指定了我想要生成的类。如果有人能提供一些见解,那就太棒了。

【问题讨论】:

  • 也许 LaserClass 没有用指向正确 UClass 的指针初始化?
  • 我将如何初始化它?
  • @rTaP 确保ALaerTagCharacter 的每个实例都有一个已定义的LaserClass。您的场景中可能有一个实例,您尚未为其设置 LaserClass 的值

标签: c++ unreal-engine4


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    TSubclassOf 只是一个 UClass*。在您的代码中,您永远不会分配它。所以总是LaserClass == nullptr

    要正确生成actor,您需要将LaserClass 变量分配给您打算使用的类。例如,如果您想在您的SpawnActor 之前生成一个ALaserTagLaser 调用LaserClass = ALaserTagLaser::Static_Class()

    如果您想为LaserClass 分配一个BP 类,请在虚幻编辑器中进行设置。为此,您需要在蓝图图中使用set LaserClass 节点设置它,目标是ALaserTagCharacter 的实例,或者通过在详细信息面板的ALaserTagCharacter 子类中选择默认值下拉菜单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多