はじめに
どうも、ろっさむです。
今回は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バーがたき火に入った時に減って、回復ゾーンに入った時に増えているのがわかりますね。