GetOwner() вызывает нереальный сбой редактора

Я новичок в использовании С++ и UE. Я попробовал немного простого программирования, но редактор вылетел.

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

 UNewActorComponent::UNewActorComponent()
 {

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

Я знал, что, возможно, вывод нулевой, поэтому он разбился, но не знаю, как ожидать ошибки без сбоя.


person lalap    schedule 18.09.2017    source источник
comment
Вы должны проверить значение, возвращаемое GetOwner(), и убедиться, что оно не равно null, прежде чем вызывать из него какие-либо методы.   -  person user7860670    schedule 18.09.2017
comment
ИДК, как я могу это сделать.   -  person lalap    schedule 18.09.2017
comment
Затем вам следует лучше познакомиться с C++, прочитав несколько книг. Программирование UE требует значительного уровня понимания C++.   -  person user7860670    schedule 18.09.2017


Ответы (2)


Возможно, компонент актера создан, но не инициализирован или не присоединен к объекту. Вы должны блокировать такие проверки за операторами IF или использовать макросы assert/check.

Кроме того, вы можете использовать функцию BeginPlay() вместо конструктора. BeginPlay требует, чтобы компонент был зарегистрирован и инициализирован, поэтому у него должен быть владелец.

person JonS    schedule 18.09.2017
comment
большое тебе спасибо. он работает в BeginPlay(). но как я могу проверить, инициализирован ли компонент или нет? - person lalap; 18.09.2017
comment
Используйте if (GetOwner()!=NULL) или if (GetOwner()->IsValidLowLevel()). Однако, если когда-либо есть шанс, что владелец может быть недействительным в BeginPlay, вы можете поместить этот материал в Tick и закрыть его выполнение с помощью логического значения, чтобы оно не запускалось в каждом кадре. - person JonS; 18.09.2017

ПолучитьИмя();

Найти владельца компонента. Пример: при вставке компонента в кресло будет возвращена ссылка на кресло.

Из справочника API Unreal Engine:

UObjectBaseUtility::GetName

Синтаксис: FString GetName()

Примечания Возвращает имя этого объекта (без информации о пути)

ОК, выполните следующие действия:

1) Файл -> Новый проект -> С++ -> Базовый код -> Со стартовым содержимым

2) Внутри карты MinimalDefault выберите один стул и нажмите кнопку «Добавить компонент».

3) Выберите новый компонент C++

4) Выберите класс компонентов актера и нажмите кнопку «Далее».

5) В Visual Studio внутри NewActorComponent.cpp вставьте код ниже в функцию BeginPlay()

UNewActorComponent::UNewActorComponent()

{

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

}

6) Показать окно журнала в Unreal Engine 4 Окна журнала

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);


}
person ProfMarcosPacheco    schedule 18.09.2017
comment
но он вылетает, если код в UNewActorComponent не BeginPlay. поэтому шаг 5 приведет к сбою, но введенный вами полный код будет работать нормально - person lalap; 18.09.2017