はじめに
どうも、ろっさむです。
今回はUE4でDamage処理を行う際に使用する UDamageTypeについてまとめたものとなります。
DamageTypeとは?
UE4内でダメージの種類を識別するために使用するクラスです。ちなみにダメージ源とは無関係です。
例えば炎系の魔法を撃った場合や、ダメージ床を実装する場合に活用ができそうです。DamageTypeにアイコンなどの変数を用意しておいて、ダメージタイプ毎に専用のアイコンを表示すると一気にRPGっぽくなりそうですね。
実際にダメージエリアを作成してみる
まずはBPのクラス作成にて DamageTypeを選択します。
名前は Base_DTとしておきましょう。
作成したBPを開いてみると…、何もありません。
基本的にはパラメータを弄るのがメインとなります。
| カテゴリ | パラメーター名 | 概要 |
|---|---|---|
| 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」の中央のたき火部分にダメージゾーンを実装します。実際たき火に近付くと熱くて火傷しますし。
ダメージを引き起こす用のボリュームがUE4では用意されているので、そちらも使用しましょう。Pain Causing Volumeを使用します。
これらを大きさや位置など大まかに決めて配置してみます。
また、それとは別にHP回復用ゾーンも作成してみます。使用するアセットは同じく「AdvancedVillagePack」の「SM_Hay_Small_Var02」です。寝床で回復する感覚だと思っていただければ…。
こちらにも同様にPain Causing Volumeを配置します。
処理の実装
次に今回のダメージエリア用のInterfaceを作成します。名前を BPI_DamageTypeとします。
メソッドは ProcessDamageValueという名前でfloat型のダメージ数値を受け取るものを用意しておきましょう。出力時には加工した後のダメージ数値を渡します。
作成したinterfaceを先ほど作成した BaseBTに追加しておきます。
次に、実際にダメージ数値の加工部分を作成するために、メソッドをoverrideして実装しましょう。
ここでダメージ数値に対して掛ける値を用意しておきます。名前をMultiplyとします。このMultiplyの値はDamageType毎によって変化させる予定です。デフォルト値は 1としておきましょう。
ダメージ数値をこの値と掛けてから出力するようにします。
次に BaseDTを右クリックして、コンテキストメニューから CreateChildBlueprintClassを押下して、子クラスを作成します。
今回は火ダメージと回復エリアがあるので、以下の二つの子クラスを作成します。
FireDTでは Multiplyの値を30とします。
HealDTでは 逆にHPを回復したいのでMultiplyの値を-15とします。
次に、先ほどのキャンプファイヤーゾーンに置いた PainCausingVolumeを選択して、PainCausingVolumeという項目を確認します。ここの DamageTypeをFireDTに設定しましょう。
こちらの項目の詳細は以下の通りです。
| 項目名 | 概要 |
|---|---|
| Pain Causing | このボリュームがダメージを発生させているかどうか |
| Damage Per Sec | 指定した秒毎にどれくらいのダメージ量を発生させるか |
| DamageType | ダメージの種類の設定 |
| Pain Interval | ダメージを何秒毎に発生させるかの時間間隔を調整する項目 |
| Entry Pain | ボリュームに入った瞬間ダメージを発生させるかどうか |
極端に言ってしまえばこのボリュームだけでもダメージエリアは実装できちゃうんですが、それだと今後同じようなダメージエリアを作った場合にいちいち Damage Per Secを用意したり、ダメージ毎のアクション(例えば溺れたり火傷したり)というのがかなり作りづらくなります。
次に回復ゾーンにおいたボリュームの PainCausingVolumeを選択して、PainCausingVolume > DamageTypeをHealDTに設定しましょう。
最後にプレイヤーキャラクターのBPにて AnyDamage から以下のような処理を繋げれば実装完了です。
小さくてちょっと確認しづらいかもしれませんが、HPバーがたき火に入った時に減って、回復ゾーンに入った時に増えているのがわかりますね。






















