55.イベントBeginOverLap,EndOverLapノードとは? 重なりを検知してみよう
重なりを検知するノードとは?
では重なりを検知するイベントActorBeginOverlapやイベントActorEndOverlapノードについて解説していきます。まず簡単に説明します。
まずイベントActorBeginOverlapノードですが、これはアクタの重なった瞬間に処理を実行するノードです。例えばプレイヤーが火のコリジョンの範囲に入った時に、ダメージ処理を行う場合にイベントActorBeginOverlapノードを使用します↓
https://scrapbox.io/files/65c84d996feeef0026eb2fbd.jpg
もう一つ紹介する「イベントActorEndOverlap」ノードですが、これはアクタの重なりから抜けた瞬間に処理を実行するノードです。例えばプレイヤーが火のコリジョンの範囲から抜けた時にダメージ処理を停止させる事ができます↓
https://scrapbox.io/files/65c84e05450be50024a760cc.jpg
🐱では実際にOverlap系のノードを使用して重なりを検知するという処理を簡単に作っていきましょう!
①重なった時に処理を実行する(イベントActorBeginOverlap)
では重なった瞬間に処理を実行していきます。
サードパーソンのテンプレートプロジェクトのデフォルトの状態から行っていきます。
形状からSphereを追加します。
https://scrapbox.io/files/65c84e7e80930f0024d03dbf.jpg
Sphereを選択した状態でコリジョンプリセットにはOverlapAllを選択します。
https://scrapbox.io/files/65c84e9605473100239cb12d.jpg
OverlapAllのコリジョンプリセットとは?
コリジョンレスポンスの項目では他のオブジェクトタイプ全てに対してオーバーラップに選択してあるのがオーバーラッププリセットです。
オーバーラップとは衝突は行わないが重なりを検知する設定です。今回他のオブジェクトタイプに対して全てオーバーラップになっているので、他のアクタとは衝突せずに重なりを検知するという挙動になります。
さらにコリジョン > GenerateOverlapEventsにチェックを入れます。
https://scrapbox.io/files/65c850086bb9d50026c1a41c.jpg
GenerateOverlapEventsとは?
今回紹介するOverlap系のはこの設定にチェックを入れいないと実行されません。なのでOverlap系のノードを使用して処理を行う場合には、事前に必ずこの設定項目にチェック入れる必要があります。\
BP_ThirdPersonCharacterを開きます。
https://scrapbox.io/files/65c8503a450be50024a76da4.jpg
イベントグラフを開きます。既存のノードは無視しておいて以下のノードを追加します。イベントActorBeginOverlapノードとPrintStringノードを追加します。PrintStringには「他アクタと重なった!」と入力します。
https://scrapbox.io/files/65c850853d51b9002433e69b.jpg
イベントActorBeginOverlapノードとは?
イベントActorBeginOverlapノードを記載したアクタと、他のアクタと重なり始めた瞬間に後続のノードを実行するノードです。
試しにプレイしてみましょう。プレイしたらキューブと重なったタイミングでテキスト表示されます。
https://youtu.be/45iN2j3TEIQ
このようにイベントActorBeginOverlapノードで他アクタとの重なりを検知できます。あくまでこのノードは重なり始めの瞬間にノードが実行されるので、重なっている間に何度も実行されるという訳ではありません。
先ほど例で挙げたようにこのイベントActorBeginOverlapノードを使用する事で、火のコリジョン範囲にプレイヤーが入った時にダメージを与えるなどの処理を作る事ができます。
https://scrapbox.io/files/65c84d996feeef0026eb2fbd.jpg
②重なりから抜けた時に処理を実行する(イベントActorEndOverlap)
では今度は重なりから抜けた時に処理を実行するノードについて紹介していきます。
先ほど配置したOverlapAllに設定したSphereをそのまま使用していきます。
BP_ThirdPersonCharacterを開きます。
https://scrapbox.io/files/65c8503a450be50024a76da4.jpg
イベントグラフに以下を追加します。イベントActorEndOverlapノードを作成して、PrintStringで「他アクタと重なった状態から抜けた!」と入力します。
https://scrapbox.io/files/65c85193cb46f3002594436c.jpg
イベントActorEndOverlapとは?
イベントActorEndOverlapノードは記載したアクタと他アクタと重なった状態から抜けた瞬間に後続のノードを実行します。つまり重なりを抜けた瞬間に処理を実行するノードになります。
プレイして確認してみましょう。プレイヤーがキューブと重なった状態から抜けた時にテキストが表示されるようになりました。
https://youtu.be/efNsFVg68bs
このように重なりから抜けた瞬間に処理を行えるのがイベントActorEndOverlapノードになります。例えばこのノードは火のコリジョンと重なっている状態から抜けた時などに処理を実行させます↓
https://scrapbox.io/files/65c84e05450be50024a760cc.jpg
なので先ほどのイベントActorBeginOverlapで火のコリジョン内に入った瞬間にダメージを与え続けるように処理を組んで、コリジョンから抜けた際にダメージ処理を停止させるといった事を実装できたりします。
🐱では「イベントActorBeginOverlap」「イベントActorEndOverlap」ノードは発動条件があるので確認しておきましょう↓
Overlap系ノードの三つの発動条件
紹介したイベントActorBeginOverlapとイベントActorEndOverlapノードなどのOverlap系ノードは三つの発動条件があります。
発動条件① 衝突するアクタの内、どちらか一方でもオーバーラップに設定してある事
発動条件② 両者のアクタでCollsionEnabledの設定項目が「CollisionEnbaled」または「QueryOnly」であること
発動条件③ 両者のアクタにてGenerate Overlap Eventsにチェックが入れる事
発動条件についてシンプルにまとめると、衝突するアクタのどちらかをコリジョンレスポンスをオーバーラップに設定している事とGenerate Overlap Eventsにチェックを入れておくという事が必要になります。
「OnComponentBeginOverlap」ノードについても紹介
イベントActorBeginOverlapに似たノード「OnComponentBeginOverlapノード」があるのでついでに紹介しておきます。シンプルに言うとイベントActorBeginOverlapノードがアクタ全体の重なりを検知するノードで、OnComponentBeginOverlapノードがコンポーネント毎に重なりを検知するノードになります。簡単に作成してみます。
BP_ThirdPersonCharacterに先ほど追加したノード(イベントActorBeginOverlapやイベントActorEndOverlapノード)は削除しておきます。
BP_ThirdPersonCharacterのCapsule Componetを選択 > 右クリック > イベントを追加 > OnComponentBeginOverlapを追加を選択します。
https://scrapbox.io/files/65c8544df86e3d00259f6ecd.gif
OnComponentBeginOverlapノードとは?
ノードを作成する際に選択したコンポーネントと、他アクタとの重なりを検知するノードになります。他アクタと重なった時に後続のノードを実行します。
詳細からでもノードを追加できる
ちなみに詳細からでもOnComponentBeginOverlapノードなどを追加する事ができます。どちらから追加してもらっても構いません。
https://scrapbox.io/files/65c854844fdf8700247aefea.jpg
PrintStringノードを追加して「プレイヤーのコンポーネントは他アクタと重なった!」と入力します。
https://scrapbox.io/files/65c854bd4fdf8700247af119.jpg
プレイして確認してみましょう。重なった時に「プレイヤーのコンポーネントは他アクタと重なった!」とテキスト表示されました。
https://scrapbox.io/files/65c854ee1ee31900247555ba.gif
🐱このようにOnComponentBeginOverlapノードでは対象のコンポーネントと他のアクタの重なりを検知する事ができます。
またイベントActorEndOverlapノードと似ている「OnComponentEndOverlap」ノードもあります。OnComponentEndOverlapノードはコンポーネントと他アクタとの重なりから抜けた時に処理を実行します。
https://scrapbox.io/files/65c85527552ad700267778a4.jpg
イベントActorBeginOverlapとOnComponentBeginOverlapノードどっちを使う?
答えとしてはどちらでも構いません。重なりを検知するノードとしては同じですが、イベントActorBeginOverlapが自身のアクタ全体と他アクタとの重なりを検知するノードで、OnComponentBeginOverlapノードが対象のコンポーネントと他アクタとの重なりを検知するノードになっています。どちらかと言えば、わかりやすいイベントActorBeginOverlapをおすすめします。イベントActorEndOverlapノードとOnComponentEndOverlapノードに関しても同じで前者をおすすめします。
まとめ (コリジョンのイベント)
コリジョンのイベント,つまり衝突時のイベントノードとしては以下があります。
table:CollisionEvent
衝突時に処理を実行する イベントHitとOnComponentHitノード
重なり始めに処理を実行する イベントActorBeginOverlapとOnComponentBeginOverlapノード
重なった状態から抜けた時に処理を実行する イベントActorEndOverlapとOnComponentEndOverlapノード
これらのノードには発動条件があるので、確認しつつ実装していきましょう。