PlayerProjectile: Tworzenie klasy bazowej C++

W projekcie obejmującym Blueprint i C ++ typowym przepływem pracy jest utworzenie klasy bazowej w C ++ ze zmiennymi i funkcjami, a następnie utworzenie podrzędnych Blueprints, które będą definiować używane zasoby i definiować inne zmienne oraz funkcje specyficzne dla Blueprints.

Klasa bazowa jest również nazywana parent class lub superclass.

W tym artykule zaimplementujemy klasę bazową PlayerProjectile w C ++. Ta klasa reprezentuje pocisk wystrzelony przez gracza. W przykładowym projekcie gracz ma trzy typy pocisków, które są reprezentowane przez child Blueprint danego PlayerProjectile.

Kliknij menu Plik w edytorze Unreal i wybierz opcję New C ++ Class , jak pokazano na poniższym obrazku. 

Na następnym ekranie wybierz klasę Actor jako parent oraz kliknij przycisk Next

W polu Name wpisz PlayerProjectile . W polu Path zachowaj domyślny folder projektu. Kliknij przycisk Create Class.

Ponieważ jest to pierwsza klasa C ++ w tym projekcie Blueprint, edytor Unreal przekształci ją w projekt C ++.

PlayerProjectile klasa użyje trzy składniki:

  • USphereComponent:  jest używany jako Root Component i do testu kolizji.
  • UStaticMeshComponent: zawiera statyczną siatkę, która będzie wizualnie reprezentować aktora.
  • UProjectileMovementComponent: komponent używany do poruszania się aktora. 

Dodaj deklarację komponentów w pliku PlayerProjectile.h , które muszą mieć następującą zawartość:

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "PlayerProjectile.generated.h"

UCLASS()
class TUTOPART3_API APlayerProjectile : public AActor
{
	GENERATED_BODY()
	
public:	
	// Sets default values for this actor's properties
	APlayerProjectile();

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

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

	UPROPERTY(VisibleAnywhere, BlueprintReadOnly)
	UStaticMeshComponent* StaticMesh;
	
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly)
	class USphereComponent* CollisionComponent;
	
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly)	
	class UProjectileMovementComponent* ProjectileMovement;

};

W pliku PlayerProjectile.cpp mamy inicjalizację trzech komponentów wykonanych w konstruktorze. Nie zapomnij dodać linii #include.

#include "PlayerProjectile.h"
#include "GameFramework/ProjectileMovementComponent.h"
#include "Engine/CollisionProfile.h"
#include "Components/SphereComponent.h"

// Sets default values
APlayerProjectile::APlayerProjectile()
{
  PrimaryActorTick.bCanEverTick = true;

  InitialLifeSpan = 10.f;

  CollisionComponent = CreateDefaultSubobject<USphereComponent>(
                                             TEXT("CollisionComponent"));
  RootComponent = CollisionComponent;
  CollisionComponent->InitSphereRadius(20.f);
  CollisionComponent->SetCollisionProfileName(
                           UCollisionProfile::BlockAllDynamic_ProfileName);

  StaticMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("StaticMesh"));
  StaticMesh->SetupAttachment(CollisionComponent);
	
  ProjectileMovement = CreateDefaultSubobject<UProjectileMovementComponent>(
                                             TEXT("ProjectileMovement"));
  ProjectileMovement->InitialSpeed = 3000.f;
  ProjectileMovement->MaxSpeed = 3000.f;
  ProjectileMovement->ProjectileGravityScale = 0.f;
}

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

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

Skompiluj kod C ++.

Początkowe wartości przypisane do komponentów można modyfikować w podrzędnych Blueprints.

Zwróć uwagę na to, że nie zdefiniowaliśmy zasobu używanego przez Static Mesh. Powinniśmy unikać odwoływania się do folderów i zasobów bezpośrednio w kodzie C ++, ponieważ zmiana nazwy zasobu lub przeniesienie go do innego folderu spowoduje błąd w kodzie C++, który będzie musiał zostać zaktualizowany i ponownie skompilowany.

Ten problem nie występuje w Blueprint. Edytor automatycznie aktualizuje odniesienia do zasobu w Blueprints po zmianie nazwy lub przeniesieniu go do innego folderu. 


Źródło:https://romeroblueprints.blogspot.com/2021/03/playerprojectile-creating-base-class-in.html