爆発物にキャラクターが触れると爆発する仕組みを作成したいと思います。将来的には、爆発の衝撃でキャラクターがダメージを受けるメカニズムも構築しようと考えていますが、今回はキャラが爆発物に触れると爆発物が爆発するところまでにしておきます。
スポンサーリンク
爆発物クラスを作成する
Explosive classを新たに作成します。親クラスにはItemクラスを選択します。名前はExplosiveにします。
Explosive.hのGENERATED_BODY()の下にpublicセクションを新たに作成しそこに幾つかの関数を宣言します。
public: AExplosive() virtual void OnOverlapBegin(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult) override; virtual void OnOverlapEnd(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex) override;
Item.hのpublicセクションに関数を宣言します。
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Item) class UParticleSystem* OverlapParticles; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Item) class USoundCue* OverlapSound;
Explosive.cppに関数の定義を記述します。
#include "Explosive.h"
#include "MyCharacter.h"
#include "Kismet/GameplayStatics.h"
#include "Engine/World.h"
#include "Sound/SoundCue.h"
#include "Kismet/GameplayStatics.h"
AExplosive::AExplosive()
{
}
void AExplosive::OnOverlapBegin(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
Super::OnOverlapBegin(OverlappedComponent, OtherActor, OtherComp, OtherBodyIndex, bFromSweep, SweepResult);
if (OtherActor)
{
AMyCharacter* Char = Cast<AMyCharacter>(OtherActor);
if (Char)
{
if (OverlapParticles)
{
UGameplayStatics::SpawnEmitterAtLocation(GetWorld(), OverlapParticles, GetActorLocation(), FRotator(0.f), true);
}
if (OverlapSound)
{
UGameplayStatics::PlaySound2D(this, OverlapSound);
}
UAnimInstance* AnimInstance = Char->GetMesh()->GetAnimInstance();
if (AnimInstance && Char->AttackMontage)
{
AnimInstance->Montage_Play(Char->AttackMontage, 1.25);
AnimInstance->Montage_JumpToSection(FName("Damage1"), Char->AttackMontage);
}
Destroy();
}
}
}
void AExplosive::OnOverlapEnd(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex)
{
Super::OnOverlapEnd(OverlappedComponent, OtherActor, OtherComp, OtherBodyIndex);
}
AttackMontageにDamage1とstandupいうセクションを新たに追加して、Damage1セクションとstandupセクションを連続再生されるように設定しています。爆発と共にキャラクターが後方に吹き飛ばされますが、すぐさま跳ね上がって起き上がります。
スポンサーリンク
Explosiveブループリント
コンパイルしてUE4エディタ起動後、Explosiveクラスをベースにブループリントを新規作成します。

ブループリント名はExplosive_BPにして、保存フォルダにBlueprintを選択します。

Explosive_BPが開いたら、スケルタルメッシュに好きな爆発物メッシュを、OverlapParticlesとOverlapSoundにそれぞれ好きなアセットを選択してコンパイルと保存を押します。アセットはマーケットプレースで無料で入手できます。

爆風によってキャラクターが吹き飛ばされた直後にキップアップします。アニメーションが若干ずれていますが、微調整すればずれを修正できます。
スポンサーリンク
スポンサーリンク




コメント