UE5初心者が「ライントレース」と「ブループリントインターフェース(BPI)」についての基礎知識を分かりやすくまとめていくぜ!
- 【この記事で学べる重要知識】
①「ライントレース」によるヒット判定(TPS視点)
②「アクションマッピング(≒キーバインド)」の設定方法
③「ブループリントインターフェース(BPI)」の使い方
④「オーバラップ」によるヒット判定 - 1~4を「インタラクト時(接触時)に開閉するドアの作り方」から学ぼう!
- ◆ライントレース版「インタラクトで開閉するドア」の作り方
- ◆ライントレース版の復習用メモ
- 【重要】「ライントレース(レイキャスト)」とは?
- ◆BPI版「インタラクトで開閉するドア」の作り方
- ◆BPI版の復習用メモ
- 【重要】BPI(ブループリントインターフェース)とは?
- ◆BP間を仲介する概念(3種)の使い分けについて
▼本文は「続きを読む」からどうぞ~!
◆ライントレース版「インタラクトで開閉するドア」の作り方
▲「インタラクト(≒プレイヤー操作)時に開閉するドア」を「ライントレース」ノードで作る解説動画。
- ライントレースによるヒット判定は、接触可能なアクターを狭い場所へたくさん配置する時など、特定の場面でかなり役立つ手法だ。
(※お手軽さだけ考えたらオーバーラップによるヒット判定の方が簡単)
◆ライントレース版の復習用メモ
[Actor]の新規BPを作り、「BP_Door」と命名する。
- [BP_Door]のビューポート左上>[+Add]>[StaticMesh]追加>「Door」と命名。
- 右側[Details]欄>[Static Mesh]項>ドアの外観を指定。
- 指定後に同アイコンをダブルクリックし、別窓の上部バー[Collision]>[Add Box Simplified Collision(≒自動で箱型の当たり判定を追加)]に設定。
※これを忘れるとドアに当たり判定が設定されていないから通り抜けてしまう。 - [Components]欄最上部の[BP_Door(Self)]選択後、[Details]欄の[▼Tags]項に「Door」タグを追加。
- (+見映えを良くしたい人のみ、[ビューポート]>左上[+Add]>ドアの外枠となるStaticMesh「DoorOut」を[Door]と同階層に追加)
▼[BP_Door]のイベントグラフを編集。
▼[BP_ThirdPersonCharacter]のイベントグラフを編集。
- これで「Eキーを押した時だけ開閉するドア」が実装できた。
- かなり地味なBPだけど、ライントレースを覚えるのに最適。
【重要】「ライントレース(レイキャスト)」とは?
- 「ライントレース」は、ゲーム内のヒット判定を行う時に使える概念。
- ヒット判定がある時、ヒット対象の細かい情報を返してくれる。
例えば、「インタラクト」機能など、ヒット判定によって起動したり状況が変化したりするイベントを作る時に使うノードだ。
※Line(直線)だけでなく、Sphere(球)・Box(箱)・Capsule(カプセル型)など、別の形状によるトレースノードもある。
よく使われるのは[Line~]と[Sphere~]の2種類だが、ここでは[Line~]系ノードに絞って紹介していく。
▼ライントレース用の各ノードまとめ。
- [Line Trace By Channel]初ヒットのみ・最重要!
直線によるヒット判定。 - [Line Trace By Profile]初ヒットのみ
定義済みのTrace Profileに基づく線形のヒット判定。 - [Line Trace For Objects]初ヒットのみ
指定オブジェクトの配列に沿う線形のヒット判定。 - [Line Trace Component]初ヒットのみ
指定コンポーネント(大体アクターのコンポーネント)に沿う線形のヒット判定。 - [Multi Line Trace By Channel]複数回ヒット判定・重要!
複数の直線によるヒット判定。 - [Multi Line Trace By Profile]複数回ヒット判定
複数のTrace Profileに基づき、線形のヒット判定を同時発射。 - [Multi Line Trace By Objects]各自レイの初ヒットのみ?
複数オブジェクトの配列(各自)に沿う線形のヒット判定。
(※ChatGPTの回答をまとめたので、間違ってる可能性もあり)
▼ライントレースノードの[Start][End][Out Hit]ピンに繋げる前後ノードは、いつも似たようなテンプレ構成になる。
【Single Line Trace (レイキャスト) by Object を使用する | Unreal Engine ドキュメント】
▼「Break Hit Result」ノードから得られる各種出力データの解説ガイド(公式)。
【トレースの概要 | Unreal Engine ドキュメント】
◆BPI版「インタラクトで開閉するドア」の作り方
▲「インタラクト(≒プレイヤー操作)時に開閉するドア」を「BPI(ブループリントインターフェース)」で作る解説動画。
- 【細かい補足】
①最初の動画はEキー入力でドアを開けていたため、そのままだと汎用性が低い。
②今回の動画は「アクションマッピング」機能(キーマウ+ゲームパッド+スマホ操作など、別々の入力方式をまとめて管理するための便利機能)が使われている。
※この「アクションマッピング」を使うと、複数の入力機器へ対応するのが楽。
◆BPI版の復習用メモ
①「BPI(ブループリントインターフェース)」を作成
- コンテンツブラウザー右クリ>[Blueprint]>[Blueprint Interface]作成>「InteractInterface」と命名。
- ダブルクリックで開き、右上[▼FUNCTIONS]>[NewFunction]を「Interact」に改名。
※読み取り専用の関数。右下で[Inputs(入力)]と[Outputs(出力)]を追加できる。
(コントローラー情報・フロート型変数・ブーリアン型変数などを出し入れ可能)
②「アクションマッピング(≒キーバインド)」を作成
上部ツールバー>[Edit]>[Project Settings]>[Input]>[▼Action Mappings]右の[+]ボタンより、新規アクションマッピング「Interact」作成。
そのまま[▼Interact]展開>キーボードアイコンクリック(光る)>[E]キーに設定する。
③プレイヤーキャラのBP編集
▼[BP_ThirdPersonCharacter]のイベントグラフを編集。
④「DoorBP」の作成と編集(+BPIを有効化)
▼[DoorBP]を作成>StatickMeshを追加してドアの外観決定>イベントグラフも編集。
※Timelineノードは、1番目の動画と同じように編集しておけばOK!
- 上部バーの[Class Settings]をクリックして有効化後、右側[Details]欄>[▼Interfaces]>[▼Implemented Interfaces]項の[Add∨]ボタン>検索欄より「InteractInterface」に指定。
- 左下の[▼INTERFACES]>[Interact]をダブルクリックで挿入。
- 挿入されたノードを、[Flip Flop]ノードの直前へ移動して繋げる。
⑤ドアに接触判定用の[Box Collision]追加
[DoorBP]のビューポート左上[+Add]>[Box Collision]を追加。
【当たり判定(Hit,Overlap)の設定方法【UE5,UE4】】
▲オーバーラップによる当たり判定についての解説記事。
【重要】BPI(ブループリントインターフェース)とは?
BPIは、異なるBP間における相互通信を補助する機能だ。
※似たような働きの[Cast to~]よりもパフォーマンスが良いらしい。
- コンテンツブラウザーから新規BPIを作り、[BPI_〇〇]などと命名する。
(例)InteractInterface。 - 作ったBPIの中で[FUNCTIONS(関数)]を作り、〇〇と命名する。
(例)Interact。 - 「イベントの起点にしたい」発信側BPへ、[〇〇 (Message)]ノードを挿入。
(例)プレイヤーからドアに[Interact (Message)]でイベント開始通知を送信。 - 「通知に応じてイベントを実行したい」受信側BPへ、①で作ったBPIを紐づける。
※受信側BPの上部[Class Settings]をクリック>右側[Inplemented Interfaces]項から指定。
(例)Interact Interface。 - 受信側BPにイベントの開始始点となるノード[Event 〇〇]を追加する。
※受信側BPの左側[▼INTERFACES]内にある〇〇をダブルクリックすれば、開始地点ノード「Event 〇〇」が追加される。
これを、[受信時に実行したいノード群]の先頭へ繋げておく。
(例)受信側のドアは、発信側であるプレイヤーからイベント開始通知を受けた時、[Event Interact]ノードに続くドア開閉イベントを実行する。
BPIは基本的に読み取り専用の関数だけど、[Input]&[Output]項目があるため、そこからコントローラー情報や変数を入出力可能。
▲かなり分かりやすいBPIの要点解説動画(3分)。
◆BP間を仲介する概念(3種)の使い分けについて
UE5でBP間を橋渡しするための代表的な概念は3つあるらしい。
「Cast To~」
【例】守衛さん。門番。
- 特定の対象しか奥へ通さない(確認が取れたら門に来た人や物の情報を取得して奥へ通す)。
別BPの情報を扱いたい時(確認したい時/処理内で使いたい時など)に書くノード。
1対1の面談であれこれ情報を参照してくるため、パフォーマンスが悪い。
Tickと同じく、使いすぎない方が良いという意見も結構見かける。
【>CastやTickのパフォーマンス問題について触れているスライド記事】
「ブループリントインターフェース(BPI)」
【例】伝書鳩。
- 不特定の相手(BPIと紐づけておいた受信側)に対し、[Message]ノードから情報を発信できる。
- 受信側ではBPIの紐づけ設定をしておく。
受信側BPの上部[Class Settings]左クリ>右側[Inplemented Interfaces]で指定。
その後、左下[▼INTERFACES]にあるBPI内部の関数名をダブクリして[Event~]ノード追加。
※紐づける前に、BPI本体(と内部の関数〇〇)をコンテンツブラウザーから作っておく必要がある。 - 戻り値を受信者から受け取れる。
あれこれ参照しないから[Cast to~]より高パフォーマンス。
慣れれば使い方も簡単だし、すごく便利な機能だと思う…!
「イベントディスパッチャー」
【例】警察本部(と受信側の警察署)。
- 特定のアクターたちへ効率よく情報を通知できる。
- 連絡先である[Bind]ノードを設定しておいた相手へ、[Call]ノードから実行開始の合図を発信する。
実行する内容は、受信側([Bind]ノードに繋げる[カスタムイベント]の中)へ書く。 - 受信側は下っ端なので、発信側に戻り値を渡せない。
「渋谷でテロが起きた!〇〇署、△△署、◇◇署は規定のマニュアル通りに動け!」と通知する警察無線みたいな役割を果たす機能だと思う。
(Callが無線親機、Bindが無線子機、Bindに紐づけるカスタムイベントは実行用のマニュアル)
受信者は発信者からの通知を待ち構えていて、通知が来た後に実行内容を処理する。
特定のタイミングで処理を呼びたい時に使う概念らしい…?
複雑な指令を1回でまとめて送れる部分や、Castより効率的な部分はBPIと同じ。
【情報参照元の記事や動画】
▲BPI&イベントディスパッチャーを比較する解説記事。
この記事を読んでみたら、自分の認識はいろいろ間違ってたっぽい…!
【イベントディスパッチャーとは - アンリアル魂】
▲イベントディスパッチャーの具体的な使用例など。
▲BPIの具体的な使用例(イメージしやすい)。
▲イベントディスパッチャーの解説動画。
まだ勉強中なので、記事の中にいろいろ間違いがあったらごめん!許して!!