執筆バージョン: Unreal Engine 4.24
執筆者/M.M
はじめに
UE4で当たり判定を実装する際に、ActorBeginOverlapを使用することがあると思います。私がこれを利用した際に、一つ落とし穴を見つけましたので、落とし穴に関して記載していきます。
この記事の内容
1. 衝突判定の確認をするための下準備
2. 実行した結果
ファイルを用意しよう
今回必要なファイルは2種類です。
- Unreal Engine 4.24
- アンリアルエンジンのテンプレートプロジェクト
実装してみよう
衝突判定の確認をするための下準備を行います
まず、左上のメニューから新しいレベルを作成します。
「ファイル」→「新規レベル」→「Default」の順にクリックします。
次に、転がす球を配置して設定を行います。
以下の手順を図.1を参考に行っていきます。
①「スフィア」をアウトライナに配置します。
②配置したスフィアの「詳細」→「Physics」→「SimulatePhysics」を選択します。
③配置したスフィアの「詳細」→「Collision」→「GenerateOverlapEvents」を選択します。
④配置したスフィアの「詳細」→「Collision」→「コリジョンプリセット」を「PhysicsActor」に設定します。
図.1
図.2
坂を作って実際に転がるか確認をしてみてください。
次に衝突判定を起こすためのマテリアルを設定します。
コンテンツブラウザの新規追加からマテリアルを追加してください。
図.3
マテリアルを追加したら図.3の設定を行ってください。
それでは、衝突判定用のCubeを作成します。
図.4
図.4を参考に当たり判定を付けたい好みのオブジェクトを配置し、「[詳細]->[ブループリント/スクリプトを追加]」を押してブループリントを作ります。
作成したブループリントを図.5を参考に設定します。
①StaticMeshComponentを選択します。
②「詳細」→「Collision」→「コリジョンプリセット」を「Custom」に選択します。
③「詳細」→「Collision」→「コリジョンプリセット」→「コリジョンレスポンス」の「PhysicsBody」をオーバークロックに切り替えます。
図.5
次に、このブループリントのConstructionScriptを図.6、図.7を参考に設定します。
①StaticMeshComponentをブループリント内にドラッグアンドドロップします。
②配置したStaticMeshComponentから、CreateDynamicMaterialInstanceを作成して、ConstuctionScriptにノードを接続します。
SourceMaterialを先ほど作成したマテリアルに切り替えます。
③マイブループリントから変数を追加して任意の名前を設定します。
名前設定後、詳細の変数の型をMaterialInstanceDynamicに変更します。
④③で設定した変数をブループリント内にドラッグアンドドロップします。
「Get」か「Set」かどちらか選択するよう指示されるので「Set」を選択します。
CreateDynamicMaterialInstanceと接続します。
図.6
図.7
次に、イベントグラフを図.8のように作成します。これで一つ出来上がりです。
続いて、同じCubeを作成して上記「ConstructionScript」まで同様に設定していきます。
イベントグラフとコリジョンは、以下のように設定してください。
①StaticMeshComponentを選択し、「詳細」→「Collision」→「GenerateOverlapevents」を選択します。
②ブループリント内で「ActorBeginOverlap」と「ActorEndOverlap」を追加します。
③同様に作成した変数を「Get」でブループリント内に配置し、「SetVectorParameterValue」を追加してそれぞれのOverlapにノードをつなげます。
ここでも任意の色を設定しますが、先ほどとは異なる色を設定するとわかりやすいかと思います。
図.8
図.9
それでは、実行した際に図.9のようになるか、皆さんの環境で球を転がし、どのような結果になるか確認しましょう。
接触した時、離れた時で、それぞれ色が変われば大丈夫です。
図.10
では、ここから私が見つけた落とし穴を実装してみます。
図.10を参考に、今開いているレベルのブループリントを開きます。
開いたら、図11を参考に下記の内容をブループリントで作成します。
①転がす球を、ブループリントにドラッグアンドドロップして配置します。
配置した球から「GetStaticMeshComponent」を追加します。
②①で配置したものから、ノードを伸ばして「SetGenerateOverlapEvent」を追加します。
キーボード等で切り替えを楽に行えるよう設定を行います。
セットした後に「PrintString」があると、変更されたことがわかりやすくなります。
③①で配置したものから伸ばして「AddrRelativeLocation」を追加します。
こちらも②と同様にわかりやすく簡単になるよう設定します。
図.11
図.12
また、配置も図.12のような感じにして、球が最初から接触している状態にします。
以上で準備完了です。
起動
パターン1 球をそのまま移動した場合
離れるまではOverlapが発動しません。
パターン2 球のoverlapをその場で解除し、再びセットしてから移動した場合
Overlapを切り替えてもstart、end共に発動しません。
パターン3 球のoverlapを解除して移動を行い、再びoverlapセットした後に移動した場合
overlapを解除して、球が動き出してからoverlapendが発動したら
overlapをセットして、球を動かすとoverlapstartが発動しました。
まとめ
既に接触している状態で衝突判定を起こすために、Overlapを使用したところ、発動しないことがありましたので上記の実験を行いました。すでにコリジョンが被っているときに、判定を起こしたいとなったときはパターン3のように無理やり起こすのもありかなと感じました。