53.コリジョンプリセットとは?② アクタ同士の衝突結果を確認してみよう
①アクタ同士を衝突結果を確認しよう(両者がブロックの場合)
まずはアクタ同士が衝突するようにコリジョンプリセットを設定していきます。そしてなぜ衝突するのかも具体的に解説していきます。
サードパーソンのテンプレートプロジェクトを使用していきます。前回のプロジェクトを引き継ぐ方は配置したテーブルだけ削除しておいてください。
https://scrapbox.io/files/65c702dd61f5d500250ef181.jpg
形状からCubeをレベルに追加します。
https://scrapbox.io/files/65c702eedad96c0025c3867b.jpg
Cubeを選択した状態で詳細からコリジョンプリセット > BlockAllにセットしておきます。
https://scrapbox.io/files/65c70311be969b0025f0a267.jpg
BlockAllは他のアクタとは衝突する設定です。コリジョンプリセットの左にある矢印をクリックすると詳細設定を確認する事ができます↓(ただしここからは設定を変更できません)
https://scrapbox.io/files/65c70338f3afbf00247bc869.jpg
🐱ではこのキューブに対してプレイヤーを衝突させてみましょう。そして衝突結果は衝突する二つのアクタのコリジョンプリセットによって決定されます。なのでプレイする前にプレイヤーのアクタのコリジョンプリセットも確認しておきましょう。
ワールドセッティングのゲームモードのDefaultPawnがBP_ThirdPersonCharacterになっていることを確認し、
ThirdPeson > Blueprints > BP_ThirdPersonCharacterを開きます。
https://scrapbox.io/files/65c70356361aae0025710ebf.jpg
このプレイヤーの場合のコリジョンはCapsuleComponentになります。CapsuleComponentを選択した状態でコリジョンプリセットを確認してみると「Pawn」になっています。
https://scrapbox.io/files/65c70390447bf8002414bc2c.jpg
プロジェクト設定を開いてエンジン > Collision > Presetを開きます。
https://scrapbox.io/files/65c703dc22b03800245bc9ad.jpg
Presetとは?
このPresetの項目でコリジョンプリセットの編集や確認などを行う事ができます。
まずはCubeのコリジョンに設定されていた「BlockAll」をダブルクリックで開きます。
https://scrapbox.io/files/65c703fcdad96c0025c38c3c.jpg
開いた詳細を見ていきましょう。プレイヤーのコリジョンに設定してあったコリジョンプリセット「Pawn」に対してはブロックに設定してある事が確認できます。
https://scrapbox.io/files/65c7043af551110025e6b18b.jpg
BlockAllのコリジョンはPawnのコリジョンに対して衝突を行う事が確認できました。
🐱つまりCubeはBP_ThirdPersonCharacterに対して「衝突する」というコリジョンが設定されているという訳です。
そしてここで一旦BlockAllのオブジェクトタイプを確認しておきます。「WorldStatic」となっています。
https://scrapbox.io/files/65c7048e4532f80025dd36ae.jpg
オブジェクトタイプとは?
前回のページで少し紹介しましたが、オブジェクトタイプはアクタの種類によって割り当てられます。明確な割り当て基準はありませんが、例えばWorldStaticは静的なオブジェクト,つまり動かないようなアクタに対して設定するオブジェクトタイプになります。基本的に既存のコリジョンプリセットのオブジェクトタイプは変更する必要はありません。
「BlockAll」の詳細設定は閉じてもらって、次にBP_ThirdPersonCharacterに設定されていた「Pawn」のコリジョンプリセットを開きます。
https://scrapbox.io/files/65c704d84b7e6c0025529a25.jpg
この「Pawn」のコリジョンプリセットは、BlockAllのオブジェクトタイプ「WorldStatic」に対してブロックが設定されています。
https://scrapbox.io/files/65c704ecc35a9d002483b637.jpg
つまりPawnのコリジョンはBlockAllのコリジョンに対して衝突を行うという設定になっています。
確認したように、二つのアクタのコリジョンは互いに対してブロック(衝突を行う)設定にしてある訳です。
ここまでの内容をイメージ図で確認してみよう
ここまでの内容をイメージ画像で確認してみましょう。BP_ThirdPersonCharacterはPawnというコリジョンプリセットで、CubeはBlockAllというコリジョンプリセットがコリジョンにセットされています。
https://scrapbox.io/files/65c7055d9eced10025a3e51d.jpg
Pawnは「WorldStatic」に対してブロックし、BlockAllは「Pawn」に対してブロックに設定してあります。この場合お互いのアクタは衝突します。
https://scrapbox.io/files/65c70585a116370026d13946.jpg
では実際にプレイして確認してみましょう。プレイヤーはキューブに対して衝突を行います。
https://scrapbox.io/files/65c706453cbf9f0024988f30.gif
このようにお互いがお互いのコリジョンに対してブロックだとアクタは衝突を行います。
では次に一方のコリジョンが衝突しない「無視する」「オーバーラップ」に設定にしてあったら衝突結果はどうなるのでしょうか?確かめていきましょう。
②アクタ同士を衝突結果を確認しよう(一方がオーバーラップの場合)
では今度は一方のアクタを「オーバーラップ」に設定して衝突結果がどうなるのか確認していきましょう。
配置したCubeはそのままで良いので、今度は形状 > Sphereを追加します。
https://scrapbox.io/files/65c7069a9eced10025a3ec40.jpg
詳細からコリジョンプリセットをOverlapallにします。
https://scrapbox.io/files/65c706b84532f80025dd4680.jpg
Overlapallがどういうコリジョンプリセットなのか確認してみます。先ほどと同じようにプロジェクト設定 > エンジン > Collision > Preset > Overlapallの項目をダブルクリックで開きます。
https://scrapbox.io/files/65c706ce22b03800245bda9a.jpg
では詳細設定を確認していきます。コリジョンレスポンスのPawnの項目を確認してみましょう。Pawnにはオーバラップの項目にチェックが入っています。
https://scrapbox.io/files/65c706f8361aae0025712995.jpg
オーバーラップの項目にチェックが入っている事でPawnに対しては「衝突はしないが重なりを検知する」という設定になります。
オーバーラップとは?
オーバーラップとは「衝突はしないが重なりを検知する」という設定になります。例えばダメージを与える火や、レースゲームのゴール判定などに使用したりします。つまりアクタとは衝突しないが、その枠内にアクタが入った時に何らかの処理を行う時に設定するものになります。後のページで実際にオーバーラップは使用していくので一旦「衝突はしないが重なりを検知する」コリジョンと覚えておきましょう。
そしてOverlapAllのオブジェクトタイプはWorldStaticである事を確認しておきます。
https://scrapbox.io/files/65c70773f3afbf00247bdf39.jpg
今度はプレイヤー側のコリジョンプリセットである「Pawn」を確認してみましょう。
https://scrapbox.io/files/65c704d84b7e6c0025529a25.jpg
OververlapAllのオブジェクトタイプ「WorldStatic」に対してはブロック(衝突を行う)が設定されています。
https://scrapbox.io/files/65c707b001bcc00026876fad.jpg
🐱Sphereはプレイヤーに対して衝突しないオーバーラップの設定で、プレイヤーはSphereに対して衝突するブロックの設定になっています。この場合二つのアクタが衝突するとどうなるのかでしょうか?試してみましょう。
プレイして試してみます。プレイヤーはSphereのアクタとは衝突せずにすり抜けるようになっています。
https://scrapbox.io/files/65c707e6e88cef0028fd7399.gif
では何故このような衝突結果になるのか解説していきます。
イメージ図で確認してみよう
Pawnは「WorldStatic」に対してブロックし、OverlapAllは「Pawn」に対してオーバーラップに設定してあるのでこの場合お互いのアクタは衝突しません。
https://scrapbox.io/files/65c7081556c7e90025f07440.jpg
衝突しない理由はブロックやオーバーラップなどのコリジョンレスポンスには優先度があるためです。コリジョンレスポンスの優先度としては無視する > オーバーラップ > ブロックとなっており、前者である方の衝突結果が優先されます。
つまり二つのアクタの内、どちらか一方が衝突しない設定(オーバーラップ)にセットしてある場合両者のアクタは衝突しなくなります。
なのでプレイヤー側のPawnのコリジョンプリセットが「WorldStatic」に対してブロックだろうが関係なく衝突しなくなるという事です。
また両者がどちらもオーバーラップだと同じようにアクタ同士は衝突しなくなります。
③アクタ同士を衝突結果を確認しよう(一方を無視するに設定した場合)
では今度はコリジョンリスポンスを無視する(Ignore)に設定してどのような挙動を行うのか確認していきます。
既存のアクタはそのままで、形状からCylinderを追加します。
https://scrapbox.io/files/65c708a40127430025923e2a.jpg
🐱では今回は既存のコリジョンプリセットではなく、自身でコリジョンプリセットを作成していきます。
Cylinderを選択した状態で詳細 > コリジョン > コリジョンプリセットをCustomに選択します。
https://scrapbox.io/files/65c708c2f8821c0026d58680.jpg
Customのコリジョンプリセットとは?
Customは自身でアクタ毎にカスタマイズできるコリジョンプリセットになります。またコリジョンプリセットはプロジェクト設定 > コリジョン > Presetから作成する事もできます。
コリジョンプリセットをCustomに設定したらコリジョンレスポンスの無視する(Ignore)にチェックを入れます。
https://scrapbox.io/files/65c70902a9c4020025509d59.jpg
すると全てのオブジェクトタイプに対して「無視する」にチェックが入ります。
https://scrapbox.io/files/65c7092ff8821c0026d588c6.jpg
「無視する」設定とは?
そのままですが他のコリジョンに対して衝突や重なりの検知を一切行わなくなります。つまり対象のオブジェクトタイプに対して衝突を行わなくなります。コリジョンが全く必要のないアクタに対してこの無視するを設定しましょう。
ではプレイして試してみましょう。プレイヤーは設置したCylinderに対して衝突を行ないません。
https://scrapbox.io/files/65c7099f73a5a20025f366ae.gif
「無視する」を設定すると対象のアクタとは衝突や重なりの検知を一切行わなくなります。どちらか一方のアクタが「無視する」だとお互いのアクタは衝突などの干渉は一切行いません。
④アクタ同士を衝突結果を確認しよう(NoCollisionに設定した場合)
では最後に「コリジョンEnabled」の設定項目をNoCollisionに設定した場合も試してみましょう。
形状からConeを設置します。
https://scrapbox.io/files/65c716450c387f0025a9d040.jpg
Coneを選択した状態でコリジョンプリセットをNoCollisionにします。
https://scrapbox.io/files/65c7166c8fdc16002e09f91c.jpg
NoCollisionがどういうコリジョンプリセットなのか確認してみます。今までと同じようにプロジェクト設定 > エンジン > Collision > Preset > NoCollisionの項目をダブルクリックで開きます。
https://scrapbox.io/files/65c716806f7eb80024f87c95.jpg
NoCollisionはどのように衝突する?
NoCollisionの「コリジョンEnabled」はNoCollsionになっています。つまりコリジョン自体を無効する設定になります。
https://scrapbox.io/files/65c7169fd411da00259bf365.jpg
なのでコリジョンレスポンスの項目がどのように設定されていようが、NoCollsionに設定したコリジョンは他のアクタとは衝突,干渉しなくなります。
https://scrapbox.io/files/65c716ef3244aa0024795c0a.jpg
では確かめてみましょう。プレイヤーはConeのアクタとは衝突しない事が確認できます。
https://scrapbox.io/files/65c7171bf3afbf00247c2d12.gif
このようにどちらか一方のコリジョンプリセットがコリジョン無効(NoCollision)に設定してあるとアクタ同士は衝突を行わなくなります。コリジョンレスポンスの「無視する」と同じ状態になります。
🐱全ての他のアクタに対して、衝突せずに一切干渉を行わない場合にはコリジョンプリセットをNoCollisionに設定しましょう。一部のアクタに対して衝突せずに一切干渉を行わない場合にはオブジェクトタイプ毎に「無視する」を設定しましょう。
Defaultについて
Defaultのコリジョンプリセットとは?
Defaultだと元のスタティックメッシュのコリジョンプリセットがそのまま適用される形になります。例えば元のスタティックメッシュが「BlockAll」なら、それがコリジョンプリセットがそのアクタのコリジョンとして適用されます。
キューブのスタティックメッシュのコリジョンプリセットを確認してみましょう。レベル上のキューブを選択した状態でCtrl+Bを押します。元アセットとなる「Cube」がコンテンツブラウザで表示されるのでダブルクリックで開きます。
https://scrapbox.io/files/65c717f0b6cc250025f2b908.jpg
詳細からコリジョン > コリジョンプリセットを確認してみましょう。コリジョンプリセットは「BlockAll」になっています。
つまりDefalutは、このメッシュだと「BlockAll」というわけです。
https://scrapbox.io/files/65c717e883e81c0024679806.jpg