Unreal Engine — это мощный движок для разработки игр, который позволяет разработчикам создавать сложные и визуально потрясающие игры. Одной из многих функций, которые предоставляет Unreal Engine, является способность создавать урон по области (AOE). В этой статье мы обсудим, как создать AOE-урон в классе C++ в Unreal Engine, используя предоставленный пример исходного кода.

Снаряд.ч

#pragma once

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

UCLASS()
class YOURPROJECTNAME_API AAProjectile : public AActor
{
    GENERATED_BODY()

public:
    AAProjectile();

protected:
    virtual void BeginPlay() override;

public:
    virtual void Tick(float DeltaTime) override;
    virtual void OnHit(UPrimitiveComponent* HitComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit);

private:
    UPROPERTY(EditAnywhere, Category = "AOE Damage")
    float Damage;

    UPROPERTY(EditAnywhere, Category = "AOE Damage")
    float AoeRange;

    UPROPERTY(EditAnywhere, Category = "AOE Damage")
    UParticleSystem* HitParticles;

    UPROPERTY(EditAnywhere, Category = "AOE Damage")
    USoundBase* HitSound;

    UPROPERTY(EditAnywhere, Category = "AOE Damage")
    TSubclassOf<UCameraShake> HitCameraShakeClass;
};

Это всего лишь пример, вам может понадобиться адаптировать его к вашему конкретному проекту.

В этом примере класс AProjectile наследуется от класса AActor и использует макрос UCLASS для создания необходимого стандартного кода. Он имеет несколько переменных UPROPERTY, которые можно редактировать в редакторе, например Damage, AoeRange, HitParticles, HitSound и HitCameraShakeClass.

В классе также есть функция OnHit, которая принимает определенные параметры, эта функция отвечает за обработку столкновения снаряда с другим актором, а также за нанесение урона, создание частиц попадания, воспроизведение звука попадания, встряхивание камеры и уничтожение снаряда. .

Важно отметить, что вам нужно будет включить необходимые заголовки для классов UParticleSystem, USoundBase и UCameraShake, а также добавить соответствующие операторы #include для классов UGameplayStatics и UPrimitiveComponent в файл cpp, чтобы этот файл заголовка мог быть успешно скомпилирован.

Снаряд.cpp

#include "AProjectile.h"
#include "Engine/World.h"
#include "GameFramework/DamageType.h"
#include "GameFramework/Actor.h"
#include "Kismet/GameplayStatics.h"
#include "Components/PrimitiveComponent.h"

void AProjectile::OnHit(UPrimitiveComponent* HitComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit)
{
    // Get the owner of the projectile
    AActor* MyOwner = GetOwner();
    if (MyOwner == nullptr) {
        Destroy();
        return;
    }

    // Get the instigator controller of the owner
    AController* MyOwnerInstgiator = MyOwner->GetInstigatorController();

    // Check if the other actor is not the owner before applying damage
    if (OtherActor && OtherActor != this && OtherActor != MyOwner) {
        // Apply direct damage to the other actor
        UGameplayStatics::ApplyDamage(OtherActor, Damage, MyOwnerInstgiator, this, UDamageType::StaticClass());

        // Spawn hit particles at the location of the hit
        UGameplayStatics::SpawnEmitterAtLocation(this, HitParticles, GetActorLocation(), GetActorRotation());

        // Apply AOE radial damage around the hit location
        UGameplayStatics::ApplyRadialDamage(this, Damage, GetActorLocation(), AoeRange, UDamageType::StaticClass(), TArray<AActor*>(), this, MyOwnerInstgiator);
    }

    // Play hit sound, shake camera and destroy the projectile
    if (HitSound) {
        UGameplayStatics::PlaySoundAtLocation(this, HitSound, GetActorLocation(), GetActorRotation());
    }
    if (HitCameraShakeClass) {
        GetWorld()->GetFirstPlayerController()->ClientStartCameraShake(HitCameraShakeClass);
    }
    Destroy();
}

Этот код взят из функции OnHit() класса AProjectile. Важно отметить, что этот код является всего лишь примером, и вам может потребоваться настроить его для своего конкретного проекта.

В этом примере функция OnHit вызывается, когда снаряд сталкивается с другим объектом. Во-первых, мы получаем владельца снаряда и контроллера-зачинщика владельца. Затем мы проверяем, не является ли другой актор владельцем, прежде чем наносить урон. Если другой актор действителен, мы переходим к нанесению урона.

Мы наносим прямой урон другому актеру, вызывая функцию ApplyDamage() на OtherActor. Мы также создаем частицы попадания в месте попадания, вызывая функцию SpawnEmitterAtLocation(). Затем мы применяем радиальный урон по области вокруг места попадания, вызывая функцию ApplyRadialDamage().

После нанесения урона проигрываем звук попадания, встряхиваем камеру и, наконец, уничтожаем снаряд.

В этом примере показано, как создать урон AOE в классе C++ в Unreal Engine с помощью функций ApplyDamage и ApplyRadialDamage класса UGameplayStatics, SpawnEmitterAtLocation и PlaySoundAtLocation, а также функции ClientStartCameraShake.

Предоставленный пример исходного кода представляет собой класс C++ под названием «AProjectile». Этот класс отвечает за обработку логики при столкновении снаряда с другим объектом. Функция OnHit() — это место, где применяется урон по площади.

Первый шаг в создании АоЕ-урона — получить владельца снаряда. Это делается путем вызова функции GetOwner(). Эта функция возвращает указатель на AActor, которому принадлежит снаряд.

Следующим шагом будет получение контроллера-зачинщика владельца. Это делается путем вызова функции GetInstigatorController() для владельца. Контроллер подстрекателя — это контроллер, который отвечает за создание снаряда.

После получения контроллера подстрекателя мы проверяем, не является ли другой актор владельцем, прежде чем наносить урон. Это делается с помощью оператора if, который проверяет, не равен ли OtherActor null, не совпадает ли он со снарядом и не совпадает ли он с владельцем. Если эти условия соблюдены, мы можем приступить к нанесению урона.

Первый тип наносимого урона — прямой урон. Это делается путем вызова функции ApplyDamage() в OtherActor. Функция ApplyDamage() принимает несколько параметров, таких как количество наносимого урона, контроллер инициатора и тип урона.

Следующий тип повреждений, которые наносятся, — это радиальные повреждения. Это делается путем вызова функции ApplyRadialDamage(). Функция ApplyRadialDamage() принимает несколько параметров, таких как количество наносимого урона, местонахождение урона, диапазон урона и тип урона.

После нанесения урона создаем излучатель в месте попадания, проигрываем звук попадания, встряхиваем камеру и, наконец, уничтожаем снаряд.

В заключение, создание AOE-повреждений в классе C++ в Unreal Engine — относительно простой процесс. Используя предоставленный пример исходного кода, разработчики могут легко создать систему урона AOE в своих собственных проектах. Важно отметить, что приведенный пример — это всего лишь один из способов создания урона по площади, и разработчики могут улучшать и настраивать его в соответствии со своими потребностями.