EnemyProjectile: Tworzenie Naprowadzającego pocisku

W tym artykule utworzymy klasę bazową C ++ reprezentującą pociski samonaprowadzające, które są wystrzeliwane z dział wroga.

Content Browser , przejdź do folderu TutoPart3który znajduje się wewnątrz C++ Classes. Kliknij prawym przyciskiem myszy wolne miejsce i wybierz opcję New C++ Class … :

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

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

EnemyProjectile klasa użyje cztery rodzaje elementów:

  • USphereComponent: jest używany jako komponent główny i do testowania kolizji.
  • UStaticMeshComponent: zawiera statyczną siatkę, która będzie wizualnie reprezentować pocisk.
  • UParticleSystemComponent: komponent z emiterem cząstek, który będzie używany do symulacji wpływu ognia na pocisk.
  • UProjectileMovementComponent: komponent używany do przemieszczania pocisku. Zostanie skonfigurowany tak, aby podążał za graczem.

Dodaj deklarację komponentów w pliku EnemyProjectile.h, która będzie wyglądać następująco:

#pragma once

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

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

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 UParticleSystemComponent* Particles;

  UPROPERTY(VisibleAnywhere, BlueprintReadOnly)	
  class UProjectileMovementComponent* ProjectileMovement;
	
};

W pliku EnemyProjectile.cpp mamy inicjalizację komponentów wykonana w konstruktorze. Nie zapomnij dodać linii #include dla komponentów

#include "EnemyProjectile.h"
#include "Engine/CollisionProfile.h"
#include "Components/SphereComponent.h"
#include "Particles/ParticleSystemComponent.h"
#include "GameFramework/ProjectileMovementComponent.h"
#include "Kismet/GameplayStatics.h"


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

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

  StaticMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("StaticMesh"));
  StaticMesh->SetupAttachment(CollisionComponent);
	
  Particles = CreateDefaultSubobject<UParticleSystemComponent>(TEXT("Particles"));
  Particles->SetupAttachment(StaticMesh);
	
  ProjectileMovement = CreateDefaultSubobject<UProjectileMovementComponent>(
                                             TEXT("ProjectileMovement"));
  ProjectileMovement->InitialSpeed = 300.f;
  ProjectileMovement->MaxSpeed = 300.f;
  ProjectileMovement->bRotationFollowsVelocity = true;
  ProjectileMovement->bIsHomingProjectile = true;
  ProjectileMovement->HomingAccelerationMagnitude = 300.f;
  ProjectileMovement->ProjectileGravityScale = 0.f;
}

// Called when the game starts or when spawned
void AEnemyProjectile::BeginPlay()
{
  Super::BeginPlay();
	
  APawn* PlayerPawn = UGameplayStatics::GetPlayerPawn(GetWorld(), 0);
	
  if(PlayerPawn)
  {
    ProjectileMovement->HomingTargetComponent = PlayerPawn->GetRootComponent();
  }
}

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

Wykonane zostały następujące kroki przy konfiguracji UProjectileMovementComponent.

  • Przypisałem wartość true do zmiennej bRotationFollowsVelocity, aby pocisk obracał się, gdy zmienia kierunek
  • Przypisałem wartość true do zmiennej bIsHomingProjectile, aby wskazać, że jest to pocisk samonaprowadzający
  • Przypisałem wartość zmiennej HomingAccelerationMagnitude , która wskazuje przyspieszenie, z jakim pocisk będzie poruszał się w kierunku celu. Użyłem tej samej wartości, co prędkość pocisku
  • Usunąłem siłę grawitacji z pocisku, przypisując wartość 0 do zmiennej ProjectileGravityScale
  • Ostatnim krokiem jest przypisanie USceneComponent do zmiennej HomingTargetComponent, która będzie używana jako cel. Odbywa się to w funkcji BeginPlay(). Celem jest RootComponent gracza.  

Skompiluj kod C ++. Zasoby systemu static mesh oraz particle zostaną wybrane w Blueprint Child Poza tym początkowe wartości przypisane do komponentów mogą być modyfikowane w podklasach Blueprints. 


Źródło:https://romeroblueprints.blogspot.com/2021/04/enemyprojectile-creating-homing.html