11
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

一人UE4 & C++Advent Calendar 2020

Day 4

【UE4】UDamageTypeを使用したダメージエリアの実装

Last updated at Posted at 2020-12-03

はじめに

どうも、ろっさむです。

今回はUE4でDamage処理を行う際に使用する UDamageTypeについてまとめたものとなります。

DamageTypeとは?

UE4内でダメージの種類を識別するために使用するクラスです。ちなみにダメージ源とは無関係です。

例えば炎系の魔法を撃った場合や、ダメージ床を実装する場合に活用ができそうです。DamageTypeにアイコンなどの変数を用意しておいて、ダメージタイプ毎に専用のアイコンを表示すると一気にRPGっぽくなりそうですね。

実際にダメージエリアを作成してみる

まずはBPのクラス作成にて DamageTypeを選択します。

image-20201202002338708.png

名前は Base_DTとしておきましょう。

作成したBPを開いてみると…、何もありません。

image-20201202002730443.png

基本的にはパラメータを弄るのがメインとなります。

image-20201202002857487.png

カテゴリ パラメーター名 概要
Damage Type(基本的にどのダメージタイプにも適用) Caused by World 例えば溶岩や水のようなワールド上のオブジェクトから受けるダメージかどうか(レベルから落ちた場合も含む)
Scale Momentum by Mass 衝突した物体の質量等によって運動量をスケールするかどうか(翻訳怪しい)
Damage Falloff ダメージの半径に対してダメージ値を減衰させる時の指数の指定。
デフォルトが1.0=リニア。2.0=距離の二乗。
Rigid Body Radial Damage Vel Change 放射状の衝撃を適用する場合、衝撃または速度変化として処理するかどうか。
Damage Impulse このタイプによってダメージを受けたアクターに適用する衝撃の大きさ。
Destruction Destructible Impulse 破壊可能なメッシュに適用する衝撃の大きさ
Destructible Damage Spread Scale 破壊可能なメッシュ上でのダメージの広がり

レベル上にダメージゾーンを用意する

今回は「AdvancedVillagePack」という無料アセット内のあるBP「BP_CampFire」の中央のたき火部分にダメージゾーンを実装します。実際たき火に近付くと熱くて火傷しますし。

image-20201202012513057.png

ダメージを引き起こす用のボリュームがUE4では用意されているので、そちらも使用しましょう。Pain Causing Volumeを使用します。

image-20201202012607235.png

これらを大きさや位置など大まかに決めて配置してみます。

image-20201202012650472.png

また、それとは別にHP回復用ゾーンも作成してみます。使用するアセットは同じく「AdvancedVillagePack」の「SM_Hay_Small_Var02」です。寝床で回復する感覚だと思っていただければ…。

image-20201202013138236.png

こちらにも同様にPain Causing Volumeを配置します。

image-20201202013248101.png

処理の実装

次に今回のダメージエリア用のInterfaceを作成します。名前を BPI_DamageTypeとします。

image-20201202013923121.png

メソッドは ProcessDamageValueという名前でfloat型のダメージ数値を受け取るものを用意しておきましょう。出力時には加工した後のダメージ数値を渡します。

image-20201202014424481.png

image-20201202014502051.png

作成したinterfaceを先ほど作成した BaseBTに追加しておきます。

image-20201202014113795.png

次に、実際にダメージ数値の加工部分を作成するために、メソッドをoverrideして実装しましょう。

image-20201202014624347.png

ここでダメージ数値に対して掛ける値を用意しておきます。名前をMultiplyとします。このMultiplyの値はDamageType毎によって変化させる予定です。デフォルト値は 1としておきましょう。

image-20201202014853284.png

ダメージ数値をこの値と掛けてから出力するようにします。

image-20201202014924980.png

次に BaseDTを右クリックして、コンテキストメニューから CreateChildBlueprintClassを押下して、子クラスを作成します。

image-20201202015008308.png

今回は火ダメージと回復エリアがあるので、以下の二つの子クラスを作成します。

image-20201202101246832.png

FireDTでは Multiplyの値を30とします。

image-20201202015122808.png

HealDTでは 逆にHPを回復したいのでMultiplyの値を-15とします。

image-20201202015111956.png

次に、先ほどのキャンプファイヤーゾーンに置いた PainCausingVolumeを選択して、PainCausingVolumeという項目を確認します。ここの DamageTypeFireDTに設定しましょう。

image-20201202015210113.png

こちらの項目の詳細は以下の通りです。

項目名 概要
Pain Causing このボリュームがダメージを発生させているかどうか
Damage Per Sec 指定した秒毎にどれくらいのダメージ量を発生させるか
DamageType ダメージの種類の設定
Pain Interval ダメージを何秒毎に発生させるかの時間間隔を調整する項目
Entry Pain ボリュームに入った瞬間ダメージを発生させるかどうか

極端に言ってしまえばこのボリュームだけでもダメージエリアは実装できちゃうんですが、それだと今後同じようなダメージエリアを作った場合にいちいち Damage Per Secを用意したり、ダメージ毎のアクション(例えば溺れたり火傷したり)というのがかなり作りづらくなります。

次に回復ゾーンにおいたボリュームの PainCausingVolumeを選択して、PainCausingVolume > DamageTypeHealDTに設定しましょう。

image-20201202102906600.png

最後にプレイヤーキャラクターのBPにて AnyDamage から以下のような処理を繋げれば実装完了です。

image-20201202015653637.png

小さくてちょっと確認しづらいかもしれませんが、HPバーがたき火に入った時に減って、回復ゾーンに入った時に増えているのがわかりますね。

DamageType.gif

参考

11
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?