Blog

[UE4] 特定条件下でOverlapが動作しない件について

執筆バージョン: Unreal Engine 4.24

執筆者/M.M

はじめに

UE4で当たり判定を実装する際にActorBeginOverlapを使用することがあると思います。私がこれを利用した際に一つ落とし穴を見つけましたので、それに関して記載していきます。

この記事の内容

1. 衝突判定の確認をするための下準備

2. 実行した結果

ファイルを用意しよう

今回必要なファイルは2種類です。

  1. Unreal Engine 4.24
  2. アンリアルエンジンのテンプレートプロジェクト

実装してみよう

衝突判定の確認をするための下準備

まず、左上のメニューから新しいレベルを作成します。

「ファイル」→「新規レベル」→「Default」の順にクリックします。

次に転がす球を配置して設定を行います。以下の手順を行っていきます。

①「スフィア」をアウトライナに配置

②配置したスフィアの「詳細」→「Physics」→「SimulatePhysics」を選択

③配置したスフィアの「詳細」→「Collision」→「GenerateOverlapEvents」を選択

④配置したスフィアの「詳細」→「Collision」→「コリジョンプリセット」を「PhysicsActor」に設定

坂を作って実際に転がるか確認をしてみてください。

次に衝突判定を起こすためのマテリアルを設定します。

コンテンツブラウザの新規追加からマテリアルを追加してください。

マテリアルを追加したら以下の設定を行ってください。

では、衝突判定用のCubeを作成します。

当たり判定を付けたい好みのオブジェクトを配置し[詳細]->[ブループリント/スクリプトを追加]を押してブループリントを作ります。

作成したブループリントを以下のように設定します。

①StaticMeshComponentを選択

②「詳細」→「Collision」→「コリジョンプリセット」を「Custom」に選択

③「詳細」→「Collision」→「コリジョンプリセット」→「コリジョンレスポンス」の「PhysicsBody」をオーバークロックに切り替え

次はこのブループリントのConstructionScriptを以下のように設定します。

①StaticMeshComponentをブループリント内にドラッグアンドドロップ

②配置したStaticMeshComponentからCreateDynamicMaterialInstanceを作成してConstuctionScriptに接続

SourceMaterialを先ほど作成したマテリアルに切り替え

③マイブループリントから変数を追加して任意の名前を設定

名前設定後、詳細の変数の型をMaterialInstanceDynamicに変更

④③で設定した変数をブループリント内にドラッグアンドドロップ

「Get」か「Set」かどちらか選択するよう指示されるので「Set」を選択

CreateDynamicMaterialInstanceと接続

次にイベントグラフを以下のように作成します

これで一つ出来上がりです。

次に同じCubeを作成して上記「ConstructionScript」まで同様に設定していきます。

イベントグラフとコリジョンは以下のように設定してください。

①StaticMeshComponentを選択し、「詳細」→「Collision」→「GenerateOverlapevents」を選択

②ブループリント内で「ActorBeginOverlap」と「ActorEndOverlap」を追加

③同様に作成した変数を「Get」でブループリント内に配置し、「SetVectorParameterValue」を追加してそれぞれのOverlapにつなげる

ここでも任意の色を設定しますが、先ほどとは異なる色を設定するとわかりやすいかと思います。

では実際に実行して球を転がしどのようになるか確認しましょう。接触したとき、離れたときで色が変われば大丈夫です。

ではここから私が見つけた落とし穴を実装してみます。今開いているレベルのブループリントを開きます。開いたら以下の内容のブループリントを作成します。

①転がす球をブループリントにドラッグアンドドロップして配置

配置した球から「GetStaticMeshComponent」を追加

②①で配置したものから伸ばして「SetGenerateOverlapEvent」を追加

キーボード等で切り替えを楽に行えるよう設定

セットした後に「PrintString」があると変更されたことがわかりやすい

③①で配置したものから伸ばして「AddrRelativeLocation」を追加

こちらも②と同様にわかりやすく簡単になるよう設定

また、配置も以下のような感じにして球が最初から接触している状態にします。以上で準備完了です。

起動

パターン1 球をそのまま移動した場合

離れるまではOverlapが発動しません。

パターン2 球のoverlapをその場で解除し、再びセットしてから移動した場合

Overlapを切り替えてもstart、end共に発動しません。

パターン3 球のoverlapを解除して移動し、再びoverlapセットした後移動した場合

overlapを解除して球が動き出してからoverlapendが発動し、

overlapをセットして球を動かすとoverlapstartが発動しました。

まとめ

既に接触している状態で衝突判定を起こすためにOverlapを使用したところ発動しないことがありましたので上記の実験を行いました。すでにコリジョンが被っているときに判定を起こしたいとなったときはパターン3のように無理やり起こすのもありかなと感じました。

参考リンク

カテゴリー・タグ一覧