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 в своих собственных проектах. Важно отметить, что приведенный пример — это всего лишь один из способов создания урона по площади, и разработчики могут улучшать и настраивать его в соответствии со своими потребностями.