Ошибки в учебном проекте из документации Unreal

Я пытаюсь изучить C++/UE4 в первый раз, и код, представленный в учебнике (в их собственной документации), выдает ошибки. Как я могу это исправить и/или найти работающее руководство?

Я пытаюсь пройти обучение по адресу https://docs.unrealengine.com/en-US/Programming/Tutorials/PlayerInput/index.html, но код, предоставленный на шаге 1, вызывает ошибки.

Я пробовал «потенциальные исправления» и искал в Интернете, но не нашел ничего, чтобы исправить ошибку.

AMyPawn::AMyPawn() { // Установите эту пешку для вызова Tick() в каждом кадре. Вы можете отключить это, чтобы улучшить производительность, если вам это не нужно. PrimaryActorTick.bCanEverTick = истина;

// Set this pawn to be controlled by the lowest-numbered player
AutoPossessPlayer = EAutoReceiveInput::Player0;

// Create a dummy root component we can attach things to.
RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("RootComponent"));
// Create a camera and a visible object

UCameraComponent* OurCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("OurCamera"));
OurVisibleComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("OurVisibleComponent"));
// Attach our camera and visible object to our root component. Offset and rotate the camera.
OurCamera->SetupAttachment(RootComponent);
OurCamera->SetRelativeLocation(FVector(-250.0f, 0.0f, 250.0f));
OurCamera->SetRelativeRotation(FRotator(-45.0f, 0.0f, 0.0f));
OurVisibleComponent->SetupAttachment(RootComponent);

}

Ошибка C2065 «UCameraComponent»: необъявленный идентификатор

Ошибка C2065 «Наша камера»: необъявленный идентификатор

Ошибка C2672 'UObject::CreateDefaultSubobject': не найдена соответствующая перегруженная функция

Ошибка C2974 «UObject:: CreateDefaultSubobject»: неверный аргумент шаблона для «TReturnType», ожидаемый тип

Ошибка MSB3075 Команда "C:\Program Files\Epic Games\UE_4.22\Engine\Build\BatchFiles\Build.bat" SecondUnrealProjectEditor Win64 Development -Project="C:\Users...\SecondUnrealProject\SecondUnrealProject.uproject" -WaitMutex -FromMsBuild" завершается с кодом 5. Убедитесь, что у вас достаточно прав для запуска этой команды.

Я ожидал, что код будет работать без ошибок, так как я точно следую руководству (и фактически скопировал «рабочий» код, чтобы убедиться, что я ничего не изменил случайно)


person user3744605    schedule 31.08.2019    source источник
comment
Если вы новичок в Unreal Engine 4, вы можете сначала прочитать наше руководство по быстрому началу программирования. В этом руководстве мы предполагаем, что вы знакомы с созданием проекта, добавлением в него кода C++ и компиляцией кода. ‹- Вы уже это делали?   -  person Max Vollmer    schedule 31.08.2019
comment
Это выглядит как достаточно очевидная ошибка, вам нужно включить файл, содержащий UCameraComponent. Я бы даже сказал, что нереальная разработка без каких-либо предварительных знаний С++ или, что еще лучше, опыта не будет интересной. Взгляните на Полное руководство и список книг по C++. Есть также видеоуроки и такие вещи, как курсы udemy, хотя я слышал, что найти хороший и полный курс может быть сложно (но это просто ересь, может быть куча хороших дунов, если вы предпочитаете видеообучение).   -  person George    schedule 31.08.2019
comment
Да, я уже сделал их первый урок. Это второй. Я все еще изучаю основы, но это тяжело, когда код, предоставленный в учебнике, не работает.   -  person user3744605    schedule 31.08.2019
comment
@ Джордж Я подумал, что это будет что-то очевидное, но в учебнике даже не предлагается включать что-то, чего я еще не сделал. К сожалению, у меня нет ни времени, ни денег, чтобы заказать книги :(   -  person user3744605    schedule 31.08.2019
comment
Да, только что попробовал этот код и могу подтвердить, что в нем отсутствует включение.   -  person Max Vollmer    schedule 31.08.2019


Ответы (2)


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

Вам нужно добавить следующее включение в ваш MyPawn.cpp:

#include "Camera/CameraComponent.h"

После исправления вы получите еще одну ошибку, на этот раз из-за отсутствия объявления для UStaticMeshComponent. Для этого вам необходимо следующее:

#include "Components/StaticMeshComponent.h"

Сообщения об ошибках различаются, потому что в первом случае компилятор хочет создать экземпляр объекта неизвестного типа, что невозможно, а во втором случае компилятор хочет присвоить указатель неизвестного типа UStaticMeshComponent другому указателю объекта. известный тип USceneComponent, и он не знает, что UStaticMeshComponent можно преобразовать в USceneComponent.

Я согласен, что это плохо, что учебник пропустил это, однако найти отсутствующее включение довольно легко с помощью правильного инструмента. В Visual Studio вы можете просто щелкнуть любой тип (например, UCameraComponent), удерживая Ctrl, и он либо сразу перейдет к объявлению, либо покажет вам список файлов с потенциальными объявлениями.

В Unreal обычно бывает так, что для каждого компонента включаемый файл имеет имя этого компонента, поэтому для UCameraComponent это CameraComponent.h, который находится в подпапке Camera.

person Max Vollmer    schedule 31.08.2019
comment
Дружище ты абсолютная легенда - person user3744605; 31.08.2019
comment
Единственная проблема заключается в том, что я все еще получаю «значение типа UStaticMeshComponent * не может быть присвоено объекту типа USceneComponent *». Можно ли исправить это, изменив USceneComponent (в MyPawn.h) на UStaticMeshComponent и наоборот, или игнорировать ошибку? (отображается в нижней части окна и появляется красная строка в коде, но ее нет в списке ошибок) - person user3744605; 31.08.2019
comment
Упс, ты прав. Я также добавил UStaticMeshComponent в свой ответ. Извиняюсь! - person Max Vollmer; 31.08.2019

Я также столкнулся с этой проблемой. Я завершил учебник с некоторыми изменениями. Visual Studios 2019 14.24.28315 UE4 4.24

MyPawn.h

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Pawn.h"
#include "Camera/CameraComponent.h"
#include "GameFramework/Character.h"
#include "MyPawn.generated.h"

UCLASS()
class HOWTO_PLAYERINPUT_API AMyPawn : public APawn
{
    GENERATED_BODY()

public:
    // Sets default values for this pawn's properties
    AMyPawn();

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

public: 
    // Called every frame
    virtual void Tick(float DeltaTime) override;

    // Called to bind functionality to input
    virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;

    UPROPERTY(EditAnywhere)
    USceneComponent* OurVisibleComponent;

    //Input functions
    void Move_XAxis(float AxisValue);
    void Move_YAxis(float AxisValue);
    void StartGrowing();
    void StopGrowing();

    //Input variables
    FVector CurrentVelocity;
    bool bGrowing;

};

MyPawn.cpp

// Fill out your copyright notice in the Description page of Project Settings.


#include "MyPawn.h"
#include "Camera/CameraComponent.h"
#include "Components/StaticMeshComponent.h"

// Sets default values
AMyPawn::AMyPawn()
{
    // Set this pawn to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
    PrimaryActorTick.bCanEverTick = true;

    // Set this pawn to be controlled by the lowest-numbered player
    AutoPossessPlayer = EAutoReceiveInput::Player0;

    // Create a dummy root component we can attach things to.
    RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("RootComponent"));
    // Create a camera and a visible object
    UPROPERTY(EditAnywhere)
    UCameraComponent* OurCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("OurCamera"));
    OurVisibleComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("OurVisibleComponent"));
    // Attach our camera and visible object to our root component. Offset and rotate the camera.
    OurCamera->SetupAttachment(RootComponent);
    OurCamera->SetRelativeLocation(FVector(-250.0f, 0.0f, 250.0f));
    OurCamera->SetRelativeRotation(FRotator(-45.0f, 0.0f, 0.0f));
    OurVisibleComponent->SetupAttachment(OurCamera);
    OurVisibleComponent->SetRelativeLocation(FVector(268.0f, 0.0f, -14.14f));
    OurVisibleComponent->SetRelativeRotation(FRotator(45.0f, 0.0f, 0.0f));


}

// Called when the game starts or when spawned
void AMyPawn::BeginPlay()
{
    Super::BeginPlay();

}

// Called every frame
void AMyPawn::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);

    // Handle growing and shrinking based on our "Grow" action

    float CurrentScale = OurVisibleComponent->GetComponentScale().X;
    if (bGrowing)
    {
        // Grow to double size over the course of one second
        CurrentScale += DeltaTime;
    }
    else
    {
        // Shrink half as fast as we grow
        CurrentScale -= (DeltaTime * 0.5f);
    }
    // Make sure we never drop below our starting size, or increase past double size.
    CurrentScale = FMath::Clamp(CurrentScale, 1.0f, 2.0f);
    OurVisibleComponent->SetWorldScale3D(FVector(CurrentScale));


    // Handle movement based on our "MoveX" and "MoveY" axes

    if (!CurrentVelocity.IsZero())
    {
        FVector NewLocation = GetActorLocation() + (CurrentVelocity * DeltaTime);
        SetActorLocation(NewLocation);
    }


}

// Called to bind functionality to input
void AMyPawn::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
    Super::SetupPlayerInputComponent(PlayerInputComponent);

    // Respond when our "Grow" key is pressed or released.
    PlayerInputComponent->BindAction("Grow", IE_Pressed, this, &AMyPawn::StartGrowing);
    PlayerInputComponent->BindAction("Grow", IE_Released, this, &AMyPawn::StopGrowing);

    // Respond every frame to the values of our two movement axes, "MoveX" and "MoveY".
    PlayerInputComponent->BindAxis("MoveX", this, &AMyPawn::Move_XAxis);
    PlayerInputComponent->BindAxis("MoveY", this, &AMyPawn::Move_YAxis);

}

void AMyPawn::Move_XAxis(float AxisValue)
{
    // Move at 100 units per second forward or backward
    CurrentVelocity.X = FMath::Clamp(AxisValue, -1.0f, 1.0f) * 100.0f;
}

void AMyPawn::Move_YAxis(float AxisValue)
{
    // Move at 100 units per second right or left
    CurrentVelocity.Y = FMath::Clamp(AxisValue, -1.0f, 1.0f) * 100.0f;
}

void AMyPawn::StartGrowing()
{
    bGrowing = true;
}

void AMyPawn::StopGrowing()
{
    bGrowing = false;
}

Я просто нахожу безумием, что каждый раз, когда UE4 обновляется, практически каждый туториал отправляется в ад. *ПРИМЕЧАНИЕ. Я долго ковырялся в этом уроке. Я в UE4 и не нашел времени, чтобы «правильно» написать этот код, поэтому, если что-то не так со стилем/соглашением, мне очень жаль;)

person Carter ash    schedule 30.01.2020