目の前のドアを調べたい。銃を撃って当たった相手を知りたい。足元に床があるか確かめたい。こうした場面では、ある地点から線を伸ばし、その先に何があるかを調べる 処理が役立ちます。
UE5では Line Trace、ほかのエンジンではレイキャスト(Raycast)と呼ばれる機能です。まずは「どこから、どこまで、何を調べるか」を押さえましょう。実践ではRキーを押し、キャラクターの前方にある箱の名前を画面へ出します。

この記事でわかること
- 線の始点と終点を、位置・向き・距離から作る方法
- チャンネルで調べる場合と、相手の種類で絞る場合の違い
- 当たった相手・場所・面の向きを取り出す方法
- Rキーで箱を調べ、距離や当たり判定を変えて比較する手順
Line Traceは「その線上に何があるか」の問い合わせ
Line Traceは、レベル内の2点を結ぶ線に沿って当たり判定を調べます。線そのものが弾として飛んだり、箱を押したりするわけではありません。 呼び出した時点の結果を受け取り、その後の処理に使います。
今回使うLine Trace By Channelは、線を遮る最初の相手を1つ返します。たとえば箱が2個並んでいても、手前の箱が線を遮れば、奥の箱は結果に入りません。
中心になる入力は、次の3つです。
| 入力 | 決めること |
|---|---|
| Start | どこから調べるか。線の始点 |
| End | どこまで調べるか。線の終点 |
| Trace Channel | 何の判定として調べるか |
位置を表すStartとEndは Vector です。ここでは、レベル内の場所をX・Y・Zの3つの数値で表したもの、と捉えてください。
主な結果も2つに分かれます。
| 出力 | 意味 |
|---|---|
| Return Value | 当たったかどうか。true/falseのBoolean |
| Out Hit | 当たった相手や場所などをまとめたHit Result |
「当たったら処理する」にはReturn Valueを使い、「誰に当たったか」にはOut Hitを使います。両方を別々に取り出すことが、後のBlueprint配線のポイントです。

StartとEnd:向きに距離を掛け、始点へ足す
キャラクターの前方を300cm調べたいとします。必要なのは、現在位置、前を向く方向、調べる距離です。
End = Start + 前方向 × 距離
Get Actor Locationで現在位置、Get Actor Forward Vectorで前方向を取れます。Forward Vectorは長さ1の方向なので、300を掛けると「前方へ300cm進んだ分」になります。それを現在位置へ足せば、線の終点です。
たとえばStartが(100, 0, 100)、前方向が(1, 0, 0)、距離が300なら、Endは(400, 0, 100)です。Endへ方向だけを入れると、現在地の前方ではなく、レベルの原点近くを指してしまいます。

UEでは通常、距離の単位はcmです。300は3m、1000は10mになります。まず短い距離で試すと、調べている範囲と画面の結果を結び付けやすくなります。
身体の前方と、カメラの前方は使い分ける
身体の前にあるものを調べるなら、Actorの位置と前方向を使います。画面中央の狙いに沿って調べたいなら、カメラのGet World LocationとGet Forward Vectorを使います。
始点と方向を、どちらも同じ基準から取る のが大切です。今回の実践は身体の前方を調べます。後方に置いたカメラからの距離とは違うので、カメラを基準に変える場合は、調べる距離も見直します。
By ChannelとFor Objects:何を対象にするか
線が見た目のモデルに触れれば、必ず結果が返るわけではありません。対象の当たり判定が検索を許可し、選んだ調べ方の条件に合う必要があります。
主な選び方は2つです。
| ノード | 対象の選び方 | 例 |
|---|---|---|
| Line Trace By Channel | 指定チャンネルに対する相手の反応を見る | Visibilityを遮る壁や箱を調べる |
| Line Trace For Objects | 相手のObject Typeを指定する | Pawnという種類だけを探す |
チャンネルは「何のための判定か」、Object Typeは「相手がどの種類か」 を表します。詳しい設定方法はコリジョンチャンネルの記事で扱っています。
By Channel:その判定を遮る相手を調べる
Visibility を指定した場合、各相手の「Visibilityへの反応」を見ます。Blockは線を遮る反応、Ignoreは無視、Overlapは通り抜ける接触として扱う反応です。
今回のように結果を1つ返す方式をSingleと呼びます。SingleのLine Trace By Channelでは、Blockになっている最初の相手 が返ります。Ignoreの相手は無視し、Overlapの相手もこのSingleの結果には入りません。
Visibilityという名前でも、画面に映るものを画像として認識する機能ではありません。相手のコリジョン設定に従います。
For Objects:指定した種類に絞る
Object TypesへPawnを指定すると、Pawnの当たり判定が対象になります。Pawnには敵AIだけでなく、プレイヤーキャラクターも含まれます。「敵だけ」という意味ではありません。
WorldStaticは、動かない地形などに使う種類です。WorldStaticの壁はPawnではないため対象外となり、壁の向こうのPawnが見つかる場合もあります。 種類で絞る検索と、壁に遮られて見えないことの判定は、分けて考えましょう。
どちらの方式でも、相手のCollision EnabledがQuery OnlyやQuery and Physicsなど、Query(位置や当たり判定を調べる検索)を許可する設定 である必要があります。Physics OnlyやNo Collisionの相手は、この検索の対象になりません。

Hit Result:当たった結果を取り出す
Hit Resultは、1回のヒットに関する情報をひとまとめにしたデータです。こうしたデータのまとまりを構造体と呼びます。
Out HitからBreak Hit Resultを作ると、中の情報を取り出せます。Breakは「壊す」という処理ではなく、まとめてある項目を個別の出力へ分けるノードです。
| 出力 | 分かること | 使う場面 |
|---|---|---|
| Hit Actor | 当たったActor | 箱を開ける、敵へダメージを渡す |
| Impact Point | 表面に当たった位置 | 火花や弾痕を出す |
| Impact Normal | 当たった面から外側へ向く、垂直な方向 | 面の向きに合わせて効果を置く |
| Distance | 始点からヒット位置までの距離 | 手が届く距離かを見る |
Normalは「面の向き」を表す矢印です。平らな壁へ正面から線を伸ばした場合、Impact Normalは壁からこちら側へ向きます。線の進む方向と同じとは限りません。

表のDistanceはLine Traceで考えた説明です。後で出てくるSphere Traceでは、球の中心が止まる位置(Location)と、表面に触れた位置(Impact Point)が分かれます。DistanceはStartからLocationまでなので、形を持つ検索へ変えるときは区別します。
Hit Bone Nameという項目もありますが、骨のあるSkeletal Meshへ当たった場合の情報です。キャラクターの手前のCapsuleへ当たっただけでは、頭の骨名は取れません。
Draw Debug Typeで線の場所を確かめる
線の計算が合っているかは、実際にどこを調べたか見えるようにする と確認できます。Line TraceノードのDraw Debug Typeを変えてみましょう。
| 設定 | 表示 |
|---|---|
| None | 線を表示しない |
| For One Frame | 1フレームだけ表示する |
| For Duration | Draw Timeで指定した秒数だけ表示する |
| Persistent | 確認用の線を残す。連続実行すると線がたまる |
キーを押したときだけ調べる今回の練習では、For Durationが見やすい設定です。ノード下部の詳細ピンを展開すると、Draw Timeや色を指定できます。
標準の赤・緑の色では、ヒットした点までが赤、その先のEndまでが緑で描かれます。緑の区間は、奥のものも結果へ入ったという意味ではありません。結果として返る相手は、最初のBlockです。
ヒットしない場合は全体が赤になります。ただしEndのすぐ近くに当たると緑の区間は短いため、色だけで決めず、命中位置の印やReturn Valueも見ます。

線がまったく見えなければ、まずイベントが動いているか、Draw Debug TypeがNoneでないかを確認します。線がカメラの外にある、表示時間が過ぎた、StartとEndが同じ、という場合もあります。
実践:Rキーで前方の箱を調べる
Enhanced Input入門で作った、白い直方体のBP_InputPracticeを使います。同じGameModeとPlayerStartでPlayでき、WASD移動が動くところから始めます。
今回は身体の前方を調べます。この練習用キャラクターは向きを固定しているため、AやDで横へ動いても、調べる向きはレベルの+X方向のままです。マウスで狙う機能は、この練習の後にカメラ基準へ変える際に扱えます。

1. 前方へ2個の箱を並べる
平らな床の上面をZ=0とし、PlayerStartをLocation=(0, 0, 100)、Rotation=(0, 0, 0)へ置きます。キャラクターはGameModeから出すため、BP_InputPracticeを追加で手配置しません。
標準のCubeを2個置き、アウトライナで名前をCube_A、Cube_Bにします。
| Actor | Location | Scale |
|---|---|---|
| Cube_A | (250, 0, 100) | (1, 1, 2) |
| Cube_B | (450, 0, 100) | (1, 1, 2) |
Rotationは両方とも(0, 0, 0)、Simulate Physicsはオフにします。Collision PresetsをBlockAllにし、Query and Physics、Object Type=WorldStatic、Visibility=Blockであることを確認します。
箱は高さ200cmなので、身体の中央から前へ伸ばす線が通ります。床は線より下にあるため、水平に調べれば手前の床へ当たらずに試せます。
2. Rキーの入力と距離の変数を用意する
InputPracticeフォルダへInput ActionのIA_TraceInspectを作ります。Value TypeはDigital (Bool)、ModifiersとTriggersは空のままです。
既存のIMC_PlayerControlsのMappingsへIA_TraceInspectを追加し、Rを割り当てます。通常移動のIMCが有効な状態で使い、練習中はFキーで操作モードを切り替えません。
BP_InputPracticeへ、小数を扱えるFloat型の変数InteractDistanceを作り、コンパイルして初期値を300にします。これは身体の中心から調べる距離です。
イベントグラフへIA_TraceInspectのイベントとLine Trace By Channelを置き、Startedから白い実行線をつなぎます。Rを押し始めたとき、1回だけ調べる構成です。
3. 線の始点と終点をつなぐ
BP_InputPracticeのグラフに、次の計算を作ります。Get Actor LocationとGet Actor Forward VectorのTargetはselfです。
- Get Actor LocationのReturn ValueをLine TraceのStartへつなぐ。
- Get Actor Forward VectorのReturn ValueからMultiplyを作り、もう一方へGet InteractDistanceをつなぐ。
- Multiplyの結果からAddを作り、もう一方へGet Actor LocationのReturn Valueをつなぐ。
- Addの結果をLine TraceのEndへつなぐ。
Multiplyは「VectorにFloatを掛ける」、Addは「Vector同士を足す」形です。型が合わない場合は、方向のVector出力から線を引いて検索し直します。

続いて現在位置を足します。Get Actor Locationの同じ出力を、StartとAddの両方へつなぎます。Addの結果はEndへ渡します。

Line Traceの設定は次のようにします。
| 入力 | 値 |
|---|---|
| Trace Channel | Visibility |
| Trace Complex | オフ |
| Ignore Self | オン |
| Actors to Ignore | 未接続 |
| Draw Debug Type | For Duration |
| Draw Time | 2 |
Ignore Selfで、処理しているBP_InputPractice自身を除きます。ほかのActorを除外したい場合に、Actors to IgnoreへMake Arrayで一覧を渡します。たとえば別Actorとして持っている武器は、必 要に応じてその一覧へ加えます。
4. 当たった場合と、外れた場合を分ける
Line Traceの白い実行出力からBranchへつなぎ、Return ValueをBranchのConditionへつなぎます。
白い線は処理の順番、赤いBooleanの線は「当たったか」の値です。Return Valueから白い実行線を出すわけではありません。
BranchのTrue側とFalse側へ、それぞれPrint Stringを1つ置きます。両方ともDurationは2にし、False側のIn Stringには「なし」と入力します。

5. 当たったActorの名前を取り出す
True側へ表示する文字を、次の順に作ります。
- Line TraceのOut HitからBreak Hit Resultを作る。
- Hit ActorからGet Display Nameを作り、Objectへつなぐ。
- Get Display NameのReturn Valueを、True側のPrint StringのIn Stringへつなぐ。
Break Hit ResultとGet Display Nameには、白い実行ピンがありません。必要な情報を取り出すノードなので、色付きのデータ線でつなぎます。 実行の順番は、先ほどのLine Trace → Branch → Print Stringのままです。

Get Display Nameは、確認用の名前 を返します。エディタでのPlayではアウトライナのCube_Aなどの名前を確認できますが、エディタ以外では内部のオブジェクト名になります。ゲーム内で敵を識別するIDや、プレイヤー向けの表示名には使いません。
6. 距離と反応を変えて、結果を比べる
コンパイル・保存してPlayし、画面をクリックします。開始位置で動かずにRを押すと、手前のCube_Aが表示されるか確認します。
続いてPlayを止め、次の順で変えて試します。毎回、開始位置から調べます。
| 変更 | 確認する結果 | 理由 |
|---|---|---|
| InteractDistance=100 | なし | 手前の箱まで線が届かない |
| InteractDistance=600 | Cube_A | 奥まで届く長さでも、手前のBlockが返る |
| 600のまま、Cube_AのVisibilityだけIgnore | Cube_B | 手前の箱を、この線の判定では無視する |
Cube_Aの反応を変えるときは、レベル上のCube_Aを選び、詳細のCollision PresetsをCustomにしてVisibilityだけIgnoreへ変えます。PawnへのBlockなど、ほかの反応はそのままです。キャラクターが歩くと箱で止まっても、Visibilityの線だけは通る、という違いを試せます。
確認後はCube_AをBlockAll、InteractDistanceを300へ戻します。次はPlay中にAやDで箱の横へずれ、Rを押して「なし」になるか見ます。画面に箱が映っていても、身体の前から伸びる線が箱を通らなければヒットしません。
MultiとSphere:複数を拾う・幅を持たせる
基本の1本で調べられるようになったら、「複数の相手が欲しい」「細い線では狙いづらい」という場面へ広げられます。この2つでは、変えるものが違います。
Multi Traceは、結果を複数受け取る
Multiは、ヒット結果をOut Hitsという 配列(複数の値を並べた一覧) で返します。ただし、Multiに変えれば必ず壁を貫通するわけではありません。
| ノード | 集める結果 |
|---|---|
| Multi Line Trace By Channel | 途中のOverlapと、最初のBlockまで |
| Multi Line Trace For Objects | 指定したObject Typeとのヒット |
By Channelでは、最初のBlockより先は調べません。途中の草をOverlap、壁をBlockにすれば、草と壁までをまとめて受け取れます。
また、Multi Line Trace By ChannelのReturn Valueは、Blockに当たったかどうかです。OverlapだけならfalseでもOut Hitsに結果が入ります。「falseだから一覧も空」と判断しないようにします。
図のWorldDynamicは、動かせる物などに使う種類です。球と奥の箱をこの種類にすると、その2つを検索対象にできます。
For Objectsは種類で集めるため、選ばなかった種類の壁は検索を遮りません。複数の相手を拾いたいのか、遮蔽物も考えたいのかを決めて選びます。

Sphere Traceは、球の幅で調べる
Sphere Trace By Channelは、StartからEndへ球を動かした範囲で、最初のBlockを調べます。これは検索に使う形で、物理的な球を出現させる処理ではありません。
Radiusは半径、つまり球の中心から外側までの距離です。狙いが少しずれても拾いたいときなどに、細いLine Traceより幅を持たせられます。

今回の箱で比較するなら、次のように試せます。
- InteractDistanceは300、Cube_AのVisibilityはBlockへ戻す。
- Cube_AのLocationのYだけ70へ変える。X=250、Z=100はそのまま。
- 開始位置からLine Traceで調べる。線が箱の横を通り、「なし」になるか確認する。
- Line Trace By ChannelをSphere Trace By Channelへ置き換える。同じStart・End・実行線・出力先をつなぎ、Radiusを30にする。
- Visibility、Trace Complexオフ、Ignore Selfオン、For Duration、Draw Time=2をそろえて、再びRで調べる。
箱の幅は100cmなので、Y=70へ置くと近い面はY=20です。Y=0を通る細い線は外れますが、半径30の球なら面まで届く、という比較です。Cube_Bは距離300より先にあるため、この確認では対象になりません。
球では、中心 が進んだ位置と箱の表面に触れた点がずれます。効果を表面へ置くならImpact Pointを使う理由も、ここで見えてきます。
うまく当たらないときのチェック
| 症状 | 確認するところ |
|---|---|
| Rを押しても何も出ない | IA_TraceInspectの割当、IMCの有効化、Play画面への入力、Startedからの白い線 |
| 線が見えない | For DurationとDraw Time、線が視点の外にないか、StartとEndが同じでないか |
| 線の向きや長さがおかしい | Endが「Start+方向×距離」になっているか |
| 線が箱を通るのに当たらない | 箱のQueryが有効か、VisibilityがBlockか、当たり判定の形があるか |
| 自分や武器を拾う | Ignore Selfがオンか。別Actorの武器ならActors to Ignoreへ入れたか |
| 名前の表示へつなげない | Out Hit → Break Hit Result → Hit Actor → Get Display Nameの順か |
| 画面に映る箱を拾わない | 今回は身体の前方を調べる。カメラの視線と混同していないか |
当たり判定の形も確認しましょう。Trace Complexは、簡略化した形と細かい形のどちらで調べるかの指定ですが、実際に使う形はメッシュ側のCollision Complexity設定にも関わります。SimpleとComplexの基礎の手順で、見た目と判定を見比べられます。
実行頻度は、欲しい結果に合わせます。ボタンを押して調べるなら今回のStartedで十分です。照準が合った相 手を常に光らせるなど、毎フレーム更新したい用途ではTickも選択肢になります。多数の相手を調べる場合は、範囲や頻度を決めて負荷を確認します。
線と名前の確認が済んだら、Draw Debug TypeをNoneにし、確認用のPrint Stringを外します。デバッグ用の線を見せることと、ゲーム内で弾や照準を描くことは別の処理です。
おまけ:先に知っておくと良いこと
- 当たらない原因の多くはチャンネル: 撃つ側のTrace Channelと、当てたい相手のCollision Responseが噛み合っていないと当たりません。まず Visibility / Camera / 自作チャンネルのどれで判定するかを決めます
- Complexは万能ではない: Trace Complexを有効にすると細かい形状に当たりますが、意図しない面に当たることもあります。弾の判定はまずSimpleで試し、必要なときだけComplexにします
- 細い相手には太い線を: 1本の線では細い対象を外しがちです。Sphere TraceやCapsule Traceにすると、ゲームとして自然な当たり方になります
- デバッグ描画を消し忘れない: 確認用のDraw Debug Typeは、仕上げのときに
Noneへ戻します
まとめ
Line Traceは、始点から終点までの線を使って、そこに何があるかを調べます。まず線の位置を見えるようにし、次に対象の種類やチャンネルへの反応を確かめると、結果の理由を追えます。
今回の練習では、距離を短くすると届かず、長くしても手前の箱で止まり、その箱のVisibilityをIgnoreにすると奥の箱が返ります。同じ2個の箱でも、設定によって「調べられる相手」が変わることを試してみてください。
Hit Actorを取り出せれば、名前を表示する先に、扉を開ける・アイテムを拾う・ダメージを渡す処理をつなげられます。相手ごとに同じ呼び方で処理を頼む方法は、Blueprint Interface入門で扱っています。
参考:Line Trace By Channel、Line Trace For Objects、Break Hit Result、Get Display Name、Multi Line Trace By Channel、Sphere Trace By Channel。