UE5 プレイヤー専用コリジョンを作ろう

※本サイトはアフィリエイト広告を利用しています。

UE5でプレイヤーとだけぶつかるもの、プレイヤーとだけ重なるものを作りたいです。
そんなときは、コリジョンプロファイルを使って実現しましょう。

やりたいこと

敵キャラが歩き出す起動用トリガはボックスコリジョンで、キャラクタ本体の後ろに配置してあります
これにプレイヤーが触れたら歩き出すようにしたいです。

しかし単に設置した状態だと、ファイヤーボールなどの飛び道具とぶつかってしまう問題があります。

よっしー
よっしー

OverlapやHitイベントのOtherActorとして応答してしまいます。
コリジョンも含めてキャラクターという扱いになっちゃうので。。。

これを避けるため、コリジョン設定でプレイヤーとだけ重なる設定にしましょう

実現方法

これにはプレイヤー専用のチャンネルの作成と、
そのチャンネル応答をプレイヤーと起動トリガーに設定が必要です

プロジェクト設定を開いてエンジンのコリジョンに進みましょう

まずプレイヤー専用のチャンネルを作ります
「Object Channels」の「新規のオブジェクトチャンネル…」ボタンを押し、名前は「PlayerOnly」、デフォルト応答を「Ignore」(無視)とします

デフォルト応答をIgnoreにしていると、すでに設定されているプリセットはみんなPlayerOnlyチャンネルを無視する設定になります

よっしー
よっしー

関係者以外利用禁止って感じです
BlockAllとかはAll(全部)といっているので、本当はプレイヤー専用もブロックに変更したほうがよいかもです

上図は Pawn プリセットで、キャラクターは基本これですが、これも PlayerOnly への応答は無視になっています。これはこのままとしましょう。

Pawn とは別途、「プレイヤーのカプセルコンポーネント」専用のプリセットをオブジェクトタイプ Pawn で作ります

さきほど作った専用チャンネルの応答をブロックに設定しています。
※ Cameraをオーバーラップにしているなどのその他の応答はご自身のプロジェクトに合わせてください。

あとはオブジェクトタイプ PlayerOnly で、Pawn だけブロックする「プレイヤーだけぶつかるやーつー」と
同じくPlayerOnly で、Pawn だけオーバーラップする「プレイヤーだけ重なるやーつー」をつくりましょう

よっしー
よっしー

無視が優先で、片方が無視だとOverlapやHitイベントは発生しません。

補足

「BlockOnlyPlayer」は「Pawn」をブロックするので、相手が「Pawn」ならなんでもHitイベントが起きるかというと起きません。プロファイル「Pawn」は「PlayerOnly」を無視しているのでそのイベントはおきません。

一方、同じオブジェクトタイプ「Pawn」でも、プロファイル「PlayerCapsule」は、「PlayerOnly」をブロックしているので、お互いブロック同士でぶつかり、Hitイベントが発生します。

結果、プレイヤーだけがぶつかりHitイベントが起きて、ほかのものはすり抜けます。

OverlapOnlyPlayerは「Pawn」に重なれる設定で、ブロック対オーバーラップだと、まずブロックするプレイヤー側のHitイベントが起きて、重なって、OverlapOnlyPlayer側のOverlapイベントが起きるという結果になります。

よっしー
よっしー

Pawnを絡めるのがなかなか難しい感じしますが、
直接オブジェクトタイプとしてプレイヤーを作っちゃうと、
ポーン共通の反応箇所も全部見直すことになりそうなので、これが手間が少ない方法なのかなと思います

  • Playerキャラに特殊なObjectTypeを設定することができるが、別処理にて他キャラクタ(Object Type:Pawn)と同じ反応を期待している処理が既にある場合は難しい
  • プレイヤーのObject Typeを変更するのではなく、Collsiionフィルタリングで実現する
【UE5】コリジョン管理・処理に関する講演メモ・補足 : Collision Data in UE5: Practical Tips for Managing Collision Settings & Queries | Unreal Fest 2023 – ぼっちプログラマのメモ (hatenablog.com)

おかずさんのブログ記事に載っていました。英語ではしんどいので大変ありがたいです。
※ただし初心者にはハードめな記事(というか講演)です(;xωx)

利用

準備ができたら、
プレイヤーとだけ重なれるトリガーにOverlapOnlyPlayer
プレイヤーのカプセルコンポーネントにPlayerCapsule

のコリジョンプリセットを設定しましょう。

これで起動させられるのはプレイヤーだけになるだけでなく、プレイヤー以外には重なるイベント自体発生しないので相手がプレイヤーかの判定も不要となります。

Before

After

地面や障害物・敵キャラ同士など、色々なものと重なったりぶつかったりしているので、プレイヤーかの判定だけでも、キャラがたくさんいれば結構たくさんの処理が発生していました。
なので、処理負荷的にもかなり減っていい感じです。

つづく

コメント

タイトルとURLをコピーしました