PlayerCharacter: Array of PlayerProjectile

PlayerCharacter można zmienić typ PlayerProjectile , który jest używany podczas gry. Klasy reprezentujące różne typy PlayerProjectile zostaną dodane do TArray  w klasie PlayerCharacter C++.

Każdy element TArray jest typu TSubclassOf <APlayerProjectile>. Użycie TSubclassOf umożliwia przechowywanie odniesień do klasy APlayerProjectile lub do dowolnej z jej klas potomnych (podklas).

Poniższy kod to nowa wersja pliku PlayerCharacter.h zawierającego zmienne i funkcje potrzebne do zmiany pocisków. Nowa treść jest pogrubiona. Należy pamiętać, że przed UCLASS() jest makro, oraz deklaracja o APlayerProjectile klasy została wykonana. W ten sposób wystarczy dodać #include „PlayerProjectile.h” do pliku cpp.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "PlayerCharacter.generated.h"

class APlayerProjectile;

UCLASS()
class TUTOPART3_API APlayerCharacter : public ACharacter
{
  GENERATED_BODY()

public:
  // Sets default values for this character's properties
  APlayerCharacter();

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;

  UFUNCTION(BlueprintCallable, Category = Movement)
  void MoveForward(float Value);
	
  UFUNCTION(BlueprintCallable, Category = Movement)
  void MoveRight(float Value);
	
  UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Projectile)
  TSubclassOf<APlayerProjectile> CurrentProjectileClass;
	
  UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Projectile)
  TArray< TSubclassOf<APlayerProjectile> > ProjectileClasses;
	
  UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = Projectile)
  int32 IndexProjectileClass;
	
  UFUNCTION(BlueprintCallable, Category = Projectile)
  void ChangeProjectile();
};

Spójrzmy na każdą z nowych deklaracji:

  • TSubclassOf <APlayerProjectile> CurrentProjectileClass: Ta zmienna przechowuje odniesienie do klasy typu APlayerProjectile, która reprezentuje pocisk wybrany przez gracza.
  • TArray <TSubclassOf <APlayerProjectile>> ProjectileClasses:  Tablica przechowująca wszystkie odwołania do klas typu APlayerProjectile, które mogą być wybrane przez gracza. 
  • int32 IndexProjectileClass:  przechowuje indeks z pozycją w tablicy wybranego APlayerProjectile. 
  • void ChangeProjectile(): funkcja, która zmienia się na następny pocisk i aktualizuje zmienne. Kiedy osiągnie koniec, wraca do początku.

W pliku PlayerCharacter.cpp mamy definicję funkcji ChangeProjectile() . Ponadto w BeginPlay () funkcji, CurrentProjectileClass zmienna jest inicjowana z pierwszego elementu tablicy, który stanowi element o indeksie 0. Nowa wersja pliku wygląda następująco:

#include "PlayerCharacter.h"
#include "PlayerProjectile.h"

// Sets default values
APlayerCharacter::APlayerCharacter()
{
  // Set this character to call Tick() every frame.
  PrimaryActorTick.bCanEverTick = true;
}

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

  if(CurrentProjectileClass == nullptr && ProjectileClasses.Num() > 0)
  {
    CurrentProjectileClass = ProjectileClasses[0];
  }	
}

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

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

void APlayerCharacter::MoveForward(float Value)
{
  AddMovementInput(GetActorForwardVector(), Value);
}

void APlayerCharacter::MoveRight(float Value)
{
  AddMovementInput(GetActorRightVector(), Value);
}

void APlayerCharacter::ChangeProjectile()
{
  IndexProjectileClass++;
	
  if(IndexProjectileClass == ProjectileClasses.Num()) 
  {
    IndexProjectileClass = 0;
  }
	
  CurrentProjectileClass = ProjectileClasses[IndexProjectileClass];
}

Źródło:https://romeroblueprints.blogspot.com/2021/03/playercharacter-array-of.html