Tworzenie Klasy Bazowej w 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 schematów, które będą definiować używane zasoby, które mogą definiować inne zmienne i funkcje specyficzne dla Blueprint.

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 schematy potomne PlayerProjectile .

Kliknij menu File w edytorze Unreal i wybierz opcję New C++ Class… , jak pokazano na poniższym zrzucie ekranu. 

Na następnym ekranie wybierz klasę aktora jako klasę nadrzędną i kliknij przycisk Nex .

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 poniższych zmiennych

  • USphereComponent :  jest używany jako składnik główny i do testu kolizji.
  • UStaticMeshComponent : zawiera model, która będzie wizualnie reprezentować aktora.
  • UProjectileMovementComponent : komponent używany do poruszania 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 wykonaną 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ę, ż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 planach po zmianie nazwy lub przeniesieniu go do innego folderu. 


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