コリジョンについて[Collision]

目次

コリジョンとは

  • コリジョンは、アクタ同士の衝突を検知して相互に反応させる機能。
  • コリジョンを設定することでぶつかったりすり抜けさせたりできる。
  • キャラクターが青い箱にぶつかると、その衝撃で青い箱が転がっている。これをすり抜けさせることもできる。
  • キャラクターと青い箱が床や壁をすり抜けずに動いているのもコリジョンによるもの。

コリジョンの設定

  • コリジョンは「詳細」タブに表示される「コリジョン」の項目で設定する。
  • 衝突してコリジョンを検知した場合に、衝突した相手にどのような反応をするのかを設定する。
  • 全てのアクタに対しての反応をそれぞれ設定するのではなく、アクタごとに「Object Type」を設定してそれに対する反応を設定する。
  • 画像の例では壁と床のアクタの「Object Type」に「WorldStatic」が設定されている。
  • 「Object Type」が「WorldStatic」に設定されているアクタに対して衝突したときにぶつかるよ、という設定にすれば全ての壁と床にぶつかってすりぬけない状態になる。

コリジョンプリセットの設定

コリジョンプリセット

  • コリジョン設定はある程度用意されていて、「コリジョンプリセット」から選択できるようになっている。
  • 「コリジョンプリセット」で選択した設定の内容は自動的に項目に反映される。
  • 「コリジョンプリセット」を別のコリジョン設定に変更すると設定内容も自動的に変更される。
  • 「コリジョンプリセット」で選択した設定内容はグレイアウトされて変更できない状態になっている。
  • コリジョンプリセットの設定内容ではカバーしきれない状況になった場合、「コリジョンプリセット」を「Custom」に変更して細かく設定することができる。
  • スタティックメッシュに設定されているコリジョン設定をしようするには「コリジョンプリセット」を「Default」にする。

コリジョンプリセットを「Custom」にした場合に変更できる項目

Collision Enabled

  • 「Collision Enabled」でコリジョンを検知する種類を選択する。

No Collision

  • コリジョン検知無し。衝突しても何もしない。

Query Only

  • 空間クエリ(レイキャスト、スイープ、オーバーラップ)に対してコリジョンを検知する
    空間クエリとは特定の範囲内のオブジェクトを効率的に検索する機能のこと。

Physics Only

  • 物理シミュレーションで移動するアクタに対してコリジョンを検知する。

Collision Enabled

  • 空間クエリと物理シミュレーションで移動するアクタに対してコリジョンを検知する。

Probe Only

  • 物理シミュレーションのコリジョンを検知するが、衝突による物理的な挙動はシミュレーションしない。
  • UE5.1から追加。

Query and Probe

  • 空間クエリと物理シミュレーションのコリジョンを検知するが、衝突による物理的な挙動はシミュレーションしない。
    UE5.1から追加。

Object Type

  • 自身の「Object Type」を設定する。

WorldStatic

  • 主にレベル上で移動しないオブジェクト(例えば床や壁、背景など)に設定する。

WorldDynamic

  • レベル上で動的に動くオブジェクト(例えばドアなど)に設定する。

Pawn

  • プレイヤーなどに設定する。

PhysicsBody

  • 物理シミュレーションによって移動するオブジェクトに設定する。

Vehicle

  • 車両に設定する。

Destructible

  • 非破壊オブジェクトに設定する。

Object Typeは「プロジェクト設定」の「コリジョン」から増やすことができる。

コリジョンレスポンス

  • コリジョンを検知したときの反応を設定する。
  • 「トレース応答」ではライントレースやカメラに対する反応を設定する。
  • 「オブジェクト応答」では「Object Type」に対する反応を設定する。

無視する(Ignore)

  • すり抜ける。衝突したことは検知しない。

オーバーラップ(Overlap)

  • すり抜けるが衝突したことは検知する。
  • 衝突したアクタが「オーバーラップ」または「ブロック」に設定されていた場合は衝突したことを検知するイベント(Overlap Event)を発生させることができる。

ブロック(Block)

  • ぶつかる。衝突したことは検知する。
    衝突したアクタも「ブロック」 に設定されていた場合、お互いにブロックしあってすり抜けない。
  • 衝突したことを検知するイベント(Hit Event)を発生させることができる。

配置されているオブジェクトの設定を見てみる

サードパーソンテンプレートの壁や床のコリジョン

  • サードパーソンキャラクターのデフォルトマップに配置されている壁や床の「コリジョンプリセット」は「Default」になっている。
  • 「Default」はスタティックメッシュに設定されているコリジョン設定を使用するということなので、そちらの設定を確認する必要がある。
  • 壁や床は同じスタティックメッシュ「SM_Cube」が使用されている。
  • フォルダに虫眼鏡がついているアイコンをクリックすると「SM_Cube」配置されている場所がコンテンブラウザで表示される。
  • コンテンツブラウザで「SM_Cube」をダブルクリックするとエディタが開く。
  • 「詳細」タブからコリジョン設定を確認すると「コリジョンプリセット」に「BlockAll」が設定されている。
  • 「BlockAll」の設定内容を確認すると、自身のObject Typeは「WorldStatic」で、全てのObject Typeに対してブロックする設定になっている。

サードパーソンテンプレートに転がっている青い箱のコリジョン設定

  • 青い箱の「コリジョンプリセット」は「PhysicsActor」に設定されている。
  • 「PhysicsActor」の設定内容を確認すると、自身のObject Typeは「PhysicsBody」で、全てのObject Typeに対してブロックする設定になっている。
  • また、青い箱は「物理」の「Simulate Physics」のチェックが入っていて物理シミュレーションで動く設定になっている。この設定がされているのでぶつかった場合に物理で動く計算が行われて転がっていく。

キャラクターの設定を見てみる

  • サードパーソンテンプレートで使用されるキャラクターのブループリント「BP_ThirdPersonCharacter」では、キャラクターのメッシュではなく、「Capsule Collision」というコリジョンのコンポーネントを追加してコリジョンを設定している。
  • キャラクターの周りに黄色い線で表示されているのがコリジョンの形状で、キャラクターの形状よりかなりシンプルな形状なのでコリジョンの処理が軽くなる。
  • 「コリジョンプリセット」は「Pawn」に設定されていて、自身のObject Typeは「Pawn」で、Visibillity以外は全てブロックする設定になっている。
  • また、キャラクターは動き回るが物理シミュレーションで動いているわけではない。

それぞれのコリジョンの関係

  • 床、青い箱、キャラクターのいずれも異なる「Object Type」が設定されているが、お互いにブロックする設定になっていた。
  • お互いにブロックし合っているため、キャラクター、青い箱ともに床を抜けずに着地している。
  • 青い箱が床に設置した後に動いているのは物理シミュレーションで動く設定になっているため、床にぶつかったときの反動が計算されて反発したような動きになっている。

青い箱が床をすり抜けるようにする

床のコリジョン設定の「オブジェクト応答」を変更する

  • 床のコリジョン設定を変更するために「コリジョンプリセット」を「Custom」に変更する。
  • コリジョン設定で、青い箱のObject Typeに設定されている「PhysicsBody」に対する反応を「無視する」に変更する。
    すり抜けさせるだけなら「オーバーラップ」にしてもOK。
  • 床はObject Typeが「PhysicsBody」に設定されているアクタに対してぶつからなくなるので、「PhysicsBody」に設定されている青い箱は床をすり抜けるようになる。
    床と壁は同じメッシュを使用しているので青い箱は壁もすり抜ける。
  • 「Object Type」が「Pawn」に設定されているキャラクターは床とぶつかる状態のままなのですり抜けない。

床のコリジョン設定の「Collision Enabled」を変更する

  • 床のコリジョン設定の「Collision Enabled」を変更してすり抜けさせてみる。
  • 床のスタティックメッシュ「SM_Cube」のコリンジョン設定「Collision Enabled」を「No collision」にする。これで床は全てのオブジェクトに対してコリジョンを検知しない状態になる。
  • 床は全てのオブジェクトに対してコリジョン検知しないので、青い箱だけでなくキャラクターもすり抜けている。
  • 今度は「Collision Enabled」を「Query Only」に変更する。
  • これにより物理シミュレーションで動いているオブジェクトのコリジョンを検知しない状態になる。
  • 物理シミュレーションで動いている青い箱は床をすり抜けている。
  • 物理シミュレーションで動いていないキャラクターは床をすり抜けない。
  • 今度は床の「Collision Enabled」を「Physics Only」に変更する。
  • 物理シミュレーションで動いている青い箱が床とぶつかり、キャラクターがすり抜ける状態になる。

青い箱のコリジョン設定の「オブジェクト応答」を変更する

  • 青い箱の床に対するコリジョン設定を変更する。
  • そのために床の「Object Type」である「WorldStatic」に対する反応を「無視する」または「オーバーラップ」に変更する。
  • 「Object Type」が「WorldStatic」に設定されている床はすり抜けるが、「Object Type」が「Pawn」に設定されているキャラクターにはぶつかる状態になった。

青い箱のコリジョン設定の「Collision Enabled」を変更する

  • 「Collision Enabled」を「No Collision」に変更してコリジョンを検知しないようにする。
  • プレイしても青い箱が落下せず、停止するとエラーが発生してしまった。
  • エラーの内容は物理シミュレーションで動いているオブジェクトと「No Collision」設定の互換性がないとのこと。
  • 今度は「Collision Enabled」を「Query Only」に変更する。
  • 青い箱は床はすり抜けるものの、こちらもエラーが発生してしまった。キャラクターとの衝突の動きもなんか怪しい。
  • 最後に「Collision Enabled」を「Physics Only」に変更するとエラーは発生しないが床はすり抜けないので、物理シミュレーションで動くアクタ側の「Collision Enabled」で相手をすり抜ける制御するのはダメそうだ。

Probe Onlyの挙動

  • UE5.1から追加された「Probe Only」に設定して挙動を確認する。
  • 青い箱は「Collision Enabled」に設定、オレンジ色の箱は「Probe Only」に設定している。
  • 青い箱は衝突した勢いで反発して転がっているが、オレンジ色の箱は衝突のによるシミュレーションが行われないためキャラクターに押されて床を滑るように動いている。

コメント

コメントする

目次