Я новичок в разработке UE4 и прошел курс Udemy по разработке Unreal Engine. Я создал новый компонент для актера с именем PositionReporter с заголовком PositionReporter.h

#pragma once

#include "CoreMinimal.h"
#include "Components/ActorComponent.h"
#include "PositionReporter.generated.h"


UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
class BUILDINGESCAPE_API UPositionReporter : public UActorComponent
{
    GENERATED_BODY()

public: 
    // Sets default values for this component's properties
    UPositionReporter();

protected:
    // Called when the game starts
    virtual void BeginPlay() override;

public: 
    // Called every frame
    virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;
};

И код в PositionReporter.cpp является

#include "PositionReporter.h"

// Sets default values for this component's properties
UPositionReporter::UPositionReporter()
{
    // Set this component to be initialized when the game starts, and to be ticked every frame.  You can turn these features
    // off to improve performance if you don't need them.
    PrimaryComponentTick.bCanEverTick = true;

    // ...
}


// Called when the game starts
void UPositionReporter::BeginPlay()
{
    Super::BeginPlay();

    FString t = GetOwner()->GetActorLabel();

    UE_LOG(LogTemp, Warning, TEXT("Position Reporter reporting for duty on %s"), *t);

}


// Called every frame
void UPositionReporter::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
{
    Super::TickComponent(DeltaTime, TickType, ThisTickFunction);

    // ...
}

Как вы можете видеть, я сейчас пытаюсь вызвать функцию GetName в Pointer для AActor, полученного через GetObject ().

Однако, как только я набираю «GetObject () ->», автозаполнение не появляется (как в видео), и когда я добавляю «GetName ()» вручную, я получаю указатель ошибки компилятора «неполный тип класса» разрешается".

Что я делаю не так? Я пропускаю импорт или так? Я уже сравнил свой код с репозиторием Бена, но не могу найти никаких отличий. Я на нереальном редакторе 4.16.0!

Я заметил еще одну странную вещь: когда я компилирую все из Unreal Engine Editor, он компилируется и работает нормально. Но когда я компилирую его с VS 2017, я получаю сообщение об ошибке, и я также не получаю Автозаполнение, которое является настоящим обломом. Чего мне не хватает?

2
Christian 27 Май 2017 в 20:31

2 ответа

Лучший ответ

Включение Engine.h в PositionReporter.h устраняет проблему.

#pragma once

#include "Engine.h" // <- This
#include "CoreMinimal.h"
#include "Components/ActorComponent.h"
#include "PositionReporter.generated.h"

Вам нужно дать Intellisense некоторое время ... На самом деле я закрыл и снова открыл решение, чтобы оно перестало отображать несуществующие ошибки и предоставило функцию автозаполнения.

ПРИМЕЧАНИЕ. . Как уже упоминалось в других статьях, это решение хорошо подходит для автозаполнения intellisense, но не является лучшим, так как оно включает в себя массу вещей и значительно увеличивает время компиляции. Включение конкретного файла .h было бы лучше, но вам нужно знать, что включать .h, и, вероятно, вы этого не знаете.

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

5
SGarofalo808 18 Авг 2017 в 19:11

Я хотел бы отметить, что включение «Engine.h» идет вразрез с IWYU начиная с Unreal 4.15 и далее, потому что Engine.h огромен и замедляет время компиляции. См. документацию Unreal для получения дополнительной информации по этому вопросу. Поэтому, хотя это решает проблему, и в этом нет ничего особенно «неправильного» - это может быть не самой лучшей идеей.

Еще один вариант, который больше соответствует IWYU, - включить Actor.h в PositionReport.cpp, поскольку GetOwner находится в классе AActor.

#include "PositionReport.h"
#include "GameFramework/Actor.h" //This is the change in PositionReport.cpp
4
flabby99 22 Июн 2017 в 13:06