「物理マテリアル設定」「On Component Hit」は直接関係ないですが、単体だとあまりに短かったため。
「On Component Hit」に関しては今更感はありますが、少し困った事態があったので。
今回やったこと
・物理マテリアルを設定して、ボールが通常より跳ねる(0.7/最大1)ように
・ボールが当たると壊れるブロックを作成
・ブロックは個別に最大HP(100)を管理して、今回は2回(1回50ダメージ)で壊れるように設定
・ブロックが壊れた時にスコアを加算
物理マテリアルの設定方法
① 物理マテリアルを作成
② マテリアルの詳細パネルで物理マテリアルと紐づける
あとは、(物理マテリアルを登録した)マテリアルを使ったブループリントなり、Static Meshなりを作成すればいいだけです。
物理マテリアル → マテリアル → BPやStaticMesh
物理マテリアルのパラメータ
一覧
大種別 | 種別 | 項目 |
Physical Material | Friction | 表面摩擦力 |
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 | プロジェクトのサーフェスタイプを編集する |
Strength | Tensile 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 PhysicsとSimulation 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 Event | UpdateScoreという名前のカスタムイベント。 引数としてScorepoint(int)を設定 |
Get Int Score | MB Mainからワイヤーを伸ばして設置する。 Int Scoreは現在のスコア(ウィジェットの内部変数) |
Set Int Score | MB Mainからワイヤーを伸ばして設置する。 Int Scoreに引数のScorepointを加算して設定。 ウィジェットでは、Event Tick処理でスコアを画面表示。 WB_WigdetTestのEvent Tick(一部) |
BP_TargetBlock(ボールがhitした時に壊れるブロック)
On Component Hit(cube) | cube型のstatic meshからイベントを追加 |
Cast To BP_Ball | On Component Hit(cube)のOther Actorのチェック。 これがないと何と接触してもOn Hitの判定が発生してしまう。 (例えばプレイヤー等)BP_Ball以外がHitを起こすとCast Failedに進む。 |
Play Sound 2D | Hit時に発生する音を出力 |
Branch | HP(ローカル変数:初期値100)の減算処理。 0以下になったら破壊処理に進む。 0より多ければ減算後のHPをセットして終了。 |
Destroy Actor | Self(自インスタンス)を破壊 |
Cast To BP_ThirdPersonCharacter | Update Scoreイベントを使用するための準備 |
Update Score | BP_ThirdPersonCharacterで作成したカスタムイベント ウィジェットのスコア表示を更新 引数として100(スコア加算値)を設定 |
コメント