普通の爆弾は爆発すると爆風(衝撃波)によって周囲の物体にも何らかの影響を及ぼします。爆風効果を実現するには、爆発と同時に爆風を発生させるメカニズムが必要ですが、爆発にradial forceとradial impulseを加えることでこれを達成することができます。
爆発に爆風効果を付ける
Grenade.hに変数と関数を宣言します。
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Damage) float Radius; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Damage) float ForceStrength; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Damage) float ImpulseStrength; UFUNCTION() void AddRadialForces();
Grenade.cppのコンストラクタに変数のデフォルト値を設定します。
AGrenade::AGrenade() { Radius = 300.f; ForceStrength = 200.f; ImpulseStrength = 200.f; Damage = 100.f; } Grenade.cppに関数の定義を記述します。
void AGrenade::AddRadialForces() { TArray Hits; FVector Location = GetActorLocation(); FVector Start = Location; FVector End = Location; FCollisionShape CollisionArea = FCollisionShape::MakeSphere(Radius); bool isHit = GetWorld()->SweepMultiByChannel(Hits, Start, End, FQuat::Identity, ECC_WorldStatic, CollisionArea); if (isHit) { for (auto& Hit : Hits) { UStaticMeshComponent* Mesh = Cast((Hit.GetActor())->GetRootComponent()); if (Mesh) { Mesh->AddRadialImpulse(GetActorLocation(), Radius, ImpulseStrength, ERadialImpulseFalloff::RIF_Constant, true); Mesh->AddRadialForce(GetActorLocation(), Radius, ForceStrength, ERadialImpulseFalloff::RIF_Constant, true); } } } }
最後にこの関数をOnExplode関数のDestroy()の上に追加します。
void AGrenade::OnExplode() { if (OverlapParticles) { UGameplayStatics::SpawnEmitterAtLocation(GetWorld(), OverlapParticles, GetActorLocation(), FRotator(0.f), true); } if (OverlapSound) { UGameplayStatics::PlaySound2D(this, OverlapSound); } TArray<AActor*> Actors; GetOverlappingActors(Actors, UDamageType::StaticClass()); for (auto Actor : Actors) { UGameplayStatics::ApplyDamage(Actor, Damage, nullptr, this, UDamageType::StaticClass()); } AddRadialForces(); Destroy(); }
これで一応爆風効果を付加することができます。
エディター内で数値を調整する
ForceStrength、ImpulseStrength、Radiusの数値をエディタ内でいじることで、爆風の強弱や爆風の影響を受ける範囲を設定することができます。
ただ、このやり方だと岩を破壊することができません。この岩は被破壊メッシュ(Destructible Mesh)に変換されているのですが、この岩を木っ端微塵に吹き飛ばすには、他のやり方を考え付く必要があります。
被破壊メッシュの作成方法
先ず、編集→プラグインで被破壊メッシュを有効にします。
検索窓にdestと入力してAPEX Destructionを有効にします。
次に被破壊メッシュに変換したいアセットを選びます。全てのメッシュを被破壊メッシュに変換できるわけではなく、スタティックメッシュと呼ばれるメッシュだけが、被破壊メッシュに変換可能です。好きなアセットを選んで右クリックでコンテクストメニューに被破壊メッシュを作成があることを確認して、あればこれを選択します。
Enable Impact Damageにチェックを入れます。
Cell Site Countの数値を大きくするとメッシュを破壊した時の破片の数が増えます。デフォルトは25ですが、とりあえずデフォルトのままにしておきます。
フラクチュアメッシュをボタン押します。
分解量のスライダーを動かすことでメッシュを分解することができます。
どのように破壊されるかが見て取れます。
見栄えを良くするために内側にもマテリアルを追加します。検索窓にskelと入力して1の方にも適当にマテリアルを追加しておきます。最後に保存を押します。
完成した被破壊メッシュをワールド内に配置します。小さい場合は拡大・縮小で拡大します。
Simulate Physicsにチェックを入れます。
Start Awakeのチェックを外します。
Simulation Generates Hit Eventsにチェックを入れます。
これで設定は完了です。
コメント