【Unreal Engine5】初めてのゲーム開発 <第11回>物理マテリアル設定と、On Hitイベントを使った処理

「物理マテリアル設定」「On Component Hit」は直接関係ないですが、単体だとあまりに短かったため。
「On Component Hit」に関しては今更感はありますが、少し困った事態があったので。

今回やったこと

・物理マテリアルを設定して、ボールが通常より跳ねる(0.7/最大1)ように
・ボールが当たると壊れるブロックを作成
・ブロックは個別に最大HP(100)を管理して、今回は2回(1回50ダメージ)で壊れるように設定
・ブロックが壊れた時にスコアを加算

目次

物理マテリアルの設定方法

① 物理マテリアルを作成

② マテリアルの詳細パネルで物理マテリアルと紐づける

あとは、(物理マテリアルを登録した)マテリアルを使ったブループリントなり、Static Meshなりを作成すればいいだけです。

物理マテリアル → マテリアル → BPやStaticMesh

物理マテリアルのパラメータ

一覧

大種別種別項目
Physical MaterialFriction表面摩擦力
Static Friction表面の摩擦停止値(高いと止まりやすい)
Friction Combine Mode複数の摩擦の計算方法(平均/低い方/乗算/高い方)
Overrride Friction Combine Modeチェックした場合、プロジェクト設定のFriction Combine Modeの代わりにこのマテリアルのを使う
Restitution表面の反発力(0:弾力無し 1:完全弾力)
1を超える値は設定できない
Restitusion Combine Mode複数の反発力の計算方法(平均/低い方/乗算/高い方)
Override Restitution Combine Modeチェックした場合、プロジェクト設定のRestitusion Combine Modeの代わりにこのマテリアルのを使う
Densityオブジェクトの形状から、質量を算定する際に乗数として使用
Sleep Lineart Velocity Threshold指定速度を下回ると、ソルバによりボディがスリープ状態になります。
Sleep Angular Velocity Threshold指定角速度を下回ると、ソルバによりボディがスリープ状態になります。
Sleep Counter Threshold指定しきい値をティック数が下回ると、ソルバによりボディがスリープ状態になります。
高度Raise Mass to Powerオブジェクトが大型化するにつれて、質量を増やす方法の調整に使用します。
フィジカルプロパティSurface Typeプロジェクトのサーフェスタイプを編集する
StrengthTensile Strengthマテリアルの引張強度。面積あたりの引張力がこの量を超えると、マテリアルは破砕する。
Compression Strengthマテリアルの圧縮強度。面積当たりの圧縮力がこの量を超えると、マテリアルは破砕するか歪む。
Sheart Strengthマテリアルのせん断強度。面積あたりのせん断力がこの量を超えると、マテリアルは破砕する。

設定要項

摩擦(Friction)・反発力は(Restitution)、関与する双方の摩擦力/反発力の平均値(プロジェクト設定で全体を定義)。
オーバーライドすることで個別に設定可能。

例えば球型インスタンスを落下させると、反発力(Restitution)を1にすると長い間バウンドすることになる(永久ではない)
途中で止まるのは重力などの他要素の影響?

今回のテストでの設定
Restitution 0.7
Restitusion Combine Mode MAX(高い方)
Override Restitution Combine Mode チェックに変更

これをBP_Ballのmaterial(M__PBall)のPhys material(PM_Ball)として設定。



On Component Hit を使った処理を行うための設定

Simulate PhysicsSimulation Generates Hit Events

どちらもStatic Meshに紐づく重要な設定です。

Simulate Physics

物理要素の一つ

物理演算のON/OFF
デフォルトがOFFなので、重力を関与させたり、押したりしたい場合はONにする必要がある。

Mass(重さ)はStaticMeshの大きさ(XYZ)で自動で設定されるが個別に設定することも可能。
Linear Dampingは水平・垂直移動の抵抗力。例えば30を設定すれば重力の影響をかなり軽減するし、100を設定すればほぼ牽引力の影響をうけなくなる。
Angular Dampingは回転への抵抗力。0だと他の力の影響がなければ永遠に回り続ける。
Enable Gravityは重力の影響をうけるかどうか。

Simulation Generates Hit Events

コリジョン要素の1つ

設定は受け手(処理を実装したい方)だけでよい。
デフォルトではOFFで、他の要素からのOn Component Hitイベントは発生しない。
はずなのだが、プレイヤー(BP_ThirdPersonCharacter)のHitは発生する…ナンデ!?


とはいえ、接触判定を行いたい場合はSimulation Generates Hit Eventsにチェックするのを忘れないようにしましょう。

Simulation Generates Hit EventsをONにすると、すべてのアクターに対して発生するので、例えば重力で床に接触した場合にも発生してしまう。

その場合は、Other Actorに対象を明示することで、特定のアクタに接触した場合のみ処理を行うことができる。
Hitを起こしたのが対象のクラス(上だとBP_Ball)以外だとCast Failedになる。

Cast To XXX → Cast Failed → Cast To YYY → Cast Failed というような判定によって当たった対象物によって異なる処理を実装できる(効率的によいのかは分からないが)。

On Component Hit を使った処理

その前に、第10回で作成したwidgetに関して。
第10回ではレベルブループリントのEvent BeginPlayでwidgetの生成処理をおこなっていましたが、スコアの更新処理の関係でレベルブループリントは扱いづらく、widget関連の処理をキャラクターのBP(BP_ThirdPersonCharacter)のEvent BeginPlayに移行しました。
率直に言うと、レベルブループリントにCast Toする方法が分からなかったので。

BP_ThirdPersonCharacter(上段はEvent Begin Playの一部)
プレイヤーキャラクターのイベントグラフでは、ウィジェットの表示とスコア更新のカスタムイベントを作成

Create Widgetウィジェットのクラスを設定し、Return Valueを変数化(WB_main)しておく
この変数を操作することでビューポートに表示されたウィジェットも同期して変更できる
Add to Viewportウィジェットをビューポート画面に表示
Add Custom EventUpdateScoreという名前のカスタムイベント。
引数としてScorepoint(int)を設定
Get Int ScoreMB Mainからワイヤーを伸ばして設置する。
Int Scoreは現在のスコア(ウィジェットの内部変数)
Set Int ScoreMB Mainからワイヤーを伸ばして設置する。
Int Scoreに引数のScorepointを加算して設定。


ウィジェットでは、Event Tick処理でスコアを画面表示。

WB_WigdetTestのEvent Tick(一部)

BP_TargetBlock(ボールがhitした時に壊れるブロック)

On Component Hit(cube)cube型のstatic meshからイベントを追加
Cast To BP_BallOn Component Hit(cube)のOther Actorのチェック。
これがないと何と接触してもOn Hitの判定が発生してしまう。
(例えばプレイヤー等)BP_Ball以外がHitを起こすとCast Failedに進む。
Play Sound 2DHit時に発生する音を出力
BranchHP(ローカル変数:初期値100)の減算処理。
0以下になったら破壊処理に進む。
0より多ければ減算後のHPをセットして終了。
Destroy ActorSelf(自インスタンス)を破壊
Cast To BP_ThirdPersonCharacterUpdate Scoreイベントを使用するための準備
Update ScoreBP_ThirdPersonCharacterで作成したカスタムイベント
ウィジェットのスコア表示を更新
引数として100(スコア加算値)を設定

コメント

コメントする

目次