首页 > 解决方案 > 指针相关的 UE4 崩溃。我的指针哪里错了?

问题描述

我正在创建一个第三人称激光标签射击游戏,但我在创建我的武器层次结构时遇到了困难。我的主要问题是我的编辑器因代码中指针的一些错误导致的访问错误而崩溃,而且我对指针的理解不足以自己解决这个问题。

我正在尝试将武器添加到我的默认棋子 ALTPlayer。我通过使用 TSubclassOf 来确保我只能将 ALTWeapon 的孩子附加到我的角色上

如果它有助于我的解释,当前的层次结构是:

APawn->ALTWeapon->ALLaserGun

...而且我计划添加更多以 ALTWeapon 为父类的类。我希望这将使我的代码更有条理,更容易为每种武器编写不同的功能。

考虑到这一点,我将从我的 ALTPlayer.h 文件开始。在这里,我将 WeaponClass 声明为我的子类变量

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "LTPlayer.generated.h"

class ALTWeapon;

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

public:
    // Sets default values
    ALTPlayer();

    // Player weapon
    UPROPERTY(EditAnywhere)
    TSubclassOf<ALTWeapon> WeaponClass;
};

现在我将进入我的 ALTPlayer.cpp 文件。在这里,我试图创建一个存储在 WeaponClass 中的 ALaserGun 对象。(我也不确定这是否正是我应该这样做的)

#include "LTPlayer.h"
#include "LaserGun.h"

// Sets default values
ALTPlayer::ALTPlayer()
{
    // Creating Weapon
    this->WeaponClass->GetDefaultObject<ALaserGun>();
}

此时,我希望在 ALTPlayer 的子蓝图中看到一个 ALaserGun 组件。虽然,由于我遇到了导致编辑器崩溃的指针问题,但我不知道这是否是这段代码产生的。

如果有人对如何修复我的指针有任何见解,这样我就不会遇到访问冲突,那就太棒了!

标签: c++unreal-engine4

解决方案


当您尝试访问其默认对象但尚未将其分配给任何东西时,您正试图取消对 WeaponClass 的引用。

您可以在构造函数初始化列表中对其进行初始化,如下所示:

ALTPlayer::ALTPlayer()
    : WeaponClass(ALTWeapon::StaticClass())
{
}

如果这是一个可以在蓝图默认设置中设置的类,您还可以通过在 PreInitializeComponents 中设置它来确保它具有值:

宣言:

//~ Begin AActor Interface
virtual void PreInitializeComponents() override;
//~ End AActor Interface

定义:

void ALTPlayer::PreInitializeComponents()
{
    Super::PreInitializeComponents();

    // Fallback to default Weapon class if none was specified.
    if (WeaponClass == nullptr)
    {
        UE_LOG(LogGameMode, Warning, TEXT("No WeaponClass was specified in %s (%s)"), *GetName(), *GetClass()->GetName());
        WeaponClass = ALTWeapon::StaticClass();
    }
}

推荐阅读