【问题标题】:GetOwner() cause unreal editor crashGetOwner() 导致虚幻编辑器崩溃
【发布时间】:2018-02-26 21:00:57
【问题描述】:

我是使用 c++ 和 UE 的新手。 我尝试了一些简单的编程,但编辑器崩溃了。

#include "NewActorComponent.h"
#include "Runtime/Engine/Classes/GameFramework/Actor.h"

 UNewActorComponent::UNewActorComponent()
 {

     PrimaryComponentTick.bCanEverTick = true;
     GetOwner()->GetName();
 }

我知道输出可能为空,所以它崩溃了,但是我知道如何在没有任何崩溃的情况下预期错误。

【问题讨论】:

  • 您应该检查GetOwner()返回的值,并在从中调用某些方法之前检查它是否为空。
  • idk 我该怎么做。
  • 那么您应该通过reading some books 更加熟悉C++。 UE 编程需要相当程度的 C++ 理解能力。

标签: c++ crash unreal-engine4


【解决方案1】:

actor 组件可能已创建但未初始化或附加到对象。您应该在 IF 语句后面进行此类检查,或使用断言/检查宏。

此外,您可能希望使用 BeginPlay() 函数而不是构造函数。 BeginPlay 要求组件被注册和初始化,所以它应该有一个所有者。

【讨论】:

  • 非常感谢。它在 BeginPlay() 中工作。但是如何检查组件是否已初始化?
  • 使用“if (GetOwner()!=NULL)”或“if (GetOwner()->IsValidLowLevel())”。但是,如果所有者有可能在 BeginPlay 中无效,您可以将这些内容放入 Tick 并使用 bool 对其执行进行门控,这样它就不会运行每一帧。
【解决方案2】:

GetName();

查找组件的所有者。 例如:在椅子中插入组件时,将返回对椅子的引用。

来自虚幻引擎 API 参考:

UObjectBaseUtility::GetName

语法:FString GetName()

备注 返回此对象的名称(没有路径信息)

好的,请按照以下步骤操作:

1) 文件 -> 新建项目 -> C++ -> 基本代码 -> 带入门内容

2) 在 MinimalDefault Map 中选择一把椅子并选择 Add Component Button。

3) 选择新建 C++ 组件

4) 选择 Actor Component Class 并点击 em Next 按钮

5) 在 Visual Studio 中的 NewActorComponent.cpp 中,在 BeginPlay() 函数中插入以下代码

UNewActorComponent::UNewActorComponent()

{

 PrimaryComponentTick.bCanEverTick = true;
 FString ObjectName = GetOwner()->GetName();
 UE_LOG(LogTemp, Warning, TEXT("ObjetctName: %s"), *Objectname);  

}

6) 在虚幻引擎 4 中显示日志窗口 Log Windows

7) 编译!

8) 在日志窗口中查看结果 logwindowresults

下面的完整代码。有用!享受吧!

#include "NewActorComponent.h"
#include "Runtime/Engine/Classes/GameFramework/Actor.h"

UNewActorComponent::UNewActorComponent()
{
    PrimaryComponentTick.bCanEverTick = true;

}

void UNewActorComponent::BeginPlay()
{
    Super::BeginPlay();
    FString NameOfObject = GetOwner()->GetName();
    UE_LOG(LogTemp, Warning, TEXT("Name is: %s"), *NameOfObject)

}


void UNewActorComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
{
    Super::TickComponent(DeltaTime, TickType, ThisTickFunction);


}

【讨论】:

  • 但如果 UNewActorComponent 中的代码不是 BeginPlay,它会崩溃。所以第 5 步会崩溃,但您插入的完整代码会正常运行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-24
  • 1970-01-01
  • 1970-01-01
  • 2019-04-21
  • 2017-09-20
相关资源
最近更新 更多