目の前のドアを調べたい。銃を撃って当たった相手を知りたい。足元が床か崖かを判定したい。どれもやりたいことは違いますが、必要な処理は同じです。 ある地点からある方向へ線を伸ばして、最初にぶつかったものを教えてもらう ことです。
UE5でこれを担当するのが Line Trace です。他のエンジンではレイキャスト(Raycast)と呼ばれる機能にあたります。この記事では、Line Trace の基本形から、当たった結果に含まれる情報、そして組んだトレースを目で確認する方法までを解説します。
この記事でわかること
- Line Traceは 見えない線を飛ばして、当たったものを調べる 機能
- By Channel と By Object Type の使い分け
- StartとEndの作り方( 位置 + 向き × 距離 )
- Hit Result から取れる4つの情報
- Draw Debug Type で線を見えるようにする
- 実践: 見ているものの名前を画面に出すインタラクト機能
Line Traceとは何か
Line Traceは、 レベルの中に一瞬だけ見えない線を引いて、その線に触れたものを報告してもらう 機能です。線そのものは物理的な存在ではなく、当たった相手を押したりもしません。あくまで問い合わせです。

必要なのは3つだけです。
| 入力 | 意味 |
|---|---|
| Start | 線の始点(ベクトル) |
| End | 線の終点(ベクトル) |
| Trace Channel / Object Types | 何を対象に調べるか |
結果として返ってくるのが2つです。
| 出力 | 意味 |
|---|---|
| Return Value(Boolean) | 何かに当たったかどうか |
| Out Hit(Hit Result) | 当たったものの詳細一式 |
用途の広さがこの機能の特徴です。銃のヒットスキャン、視線が通っているかの判定、足元の接地確認、マウスカーソルの先にあるものの 取得。 形は全部この3入力・2出力 で、変わるのはStart/Endの作り方と、当たった後にやることだけです。
StartとEndを作る
Line Traceで最初につまずくのがStartとEndです。「前方へ200cm」と書きたいのに、必要なのは2つの座標だからです。
答えは、次の式をそのままノードにすることです。
End = Start + (向きのベクトル × 距離)

Blueprintでは、こう組みます。
| 作るもの | 使うノード |
|---|---|
| Start | Get Actor Location(自分の位置) |
| 向き | Get Actor Forward Vector(自分が向いている方向。長さ1のベクトル) |
| 距離を掛ける | Multiply(Vector × Float) |
| 足す | Add(Vector + Vector) |
Get Actor Forward Vector が返すのは 長さが1のベクトル です。 向きだけを表しているので、これに 300.0 を掛ければ「前方へ300cm分」の移動量になります。それをStartに足した座標がEndです。
単位はセンチメートル です。UEの標準では1uu(Unreal Unit)= 1cmなので、 300 は3メートル先を意味します。
視線の方向で調べたいときは、始点と向きを差し替えます。三人称視点ならカメラコンポーネントの Get World Location と Get Forward Vector 、コントローラーの向きなら Get Control Rotation を Get Forward Vector に通します。 式の形は変わりません。
By ChannelとBy Object Typeの違い
Line Traceのノードは何種類かありますが、まず覚えるのは2つです。

| ノード | 調べ方 | 向いている用途 |
|---|---|---|
| Line Trace By Channel | 指定したチャンネルに Block と設定されているもの を探す | 遮蔽物の有無、視線判定、銃撃 |
| Line Trace By Object Type | 指定した 物体の種類 (WorldStatic / Pawn / PhysicsBody など)を探す | 敵だけ拾う、動く物だけ拾う |
By Channel は「壁でも箱でも敵でも、とにかく間に何かあるか」を知りたいときの道具です。既定で使えるチャンネルは Visibility と Camera の2つで、迷ったら Visibility を選びます。
By Object Type は「何が」で絞ります。Object Typesの配列に Pawn だけを入れれば、壁を無視してキャラクターだけを拾います。
どちらを選んでも、 各アクターのコリジョン設定が最終的な判定を決めます。 「絶対に当たるはずの壁に当たらない」ときは、トレース側ではなく相手のコリジョン設定を見てください。自分専用のチャンネルを追加する方法はコリジョンプロファイルの記事で扱っています。当たり判定そのものの形についてはSimple/Complexコリジョンの記事も合わせてどうぞ。
Actors to Ignoreに自分を入れる
どのトレースノードにも Actors to Ignore という配列の入力があります。ここに入れたアクターは、線が触れても無視されます。
始点を自分の位置にする以上、線は自分の内側から出発します。 自分のコリジョンが対象チャンネルをBlockしていると、出発した瞬間に自分自身へ当たって終わります。 既定のPawnプロファイルは Visibility を無視する設定なので必ず起きるわけではありませんが、コリジョン設定を自分で変えた途端に発生します。
Make Array に Self を1つ入れて Actors to Ignore へ繋ぐ。 これは書き癖にしてしまって構いません。 害はなく、原因の分かりにくいバグを1つ丸ごと消せます。
Hit Resultから取れる情報
当たったとき、 Out Hit には情報が詰まった構造体が入っています。 Break Hit Result ノードに繋ぐと中身が展開されます。よく使うのは4つです。

| ピン | 型 | 内容 | 使いどころ |
|---|---|---|---|
| Hit Actor | Actor参照 | 当たったアクター本体 | 相手が誰かを調べる、ダメージを送る |
| Impact Point | Vector | 線が表面に触れた座標 | 弾痕やエフェクトを出す位置 |
| Impact Normal | Vector | その面の向き(垂直なベクトル) | 弾痕を壁に沿って貼る、斜面の角度を知る |
| Distance | Float | StartからImpact Pointまでの距離 | 射程内かどうかの判定 |
Impact Normal は最初分かりにくいですが、 当たった面がどちらを向いているか を表す矢印です。床に当たれば真上、壁に当たれば横向きになります。エフェクトの回転をこの値に合わせると、弾痕が面にぴったり貼り付きます。
Hit Component (当たったコンポーネント)や Hit Bone Name (当たったボーン名)も取れます。ボーン名が分かるということは、 頭に当たったか胴に当たったかを区別できる ということです。ヘッドショット判定はここを見て作ります。
補足:
LocationとImpact Pointという似たピンが並んでいます。Line Traceではどちらも同じ値になりますが、後述するSphere Traceでは意味が分かれます。Impact Pointは表面に触れた点、Locationは接触したときの球の中心です。
Draw Debug Typeで線を見る
Line Traceは目に見えません。当たらないときに何を疑えばいいのか分からないのは、そのためです。
トレース系のノードには Draw Debug Type という入力があり、ここを変えると 線が画面に描かれます。
| 値 | 挙動 |
|---|---|
| None | 何も描かない(既定) |
| For One Frame | 1フレームだけ描く。Tickで毎回撃つとき用 |
| For Duration | Draw Time で指定した秒数だけ残る |
| Persistent | 消えずに残り続ける |

For Duration に設定し、 Draw Time を 2.0 にするのが最初の一手です。描かれる線には意味があります。
- 赤い線 : Startから当たった点まで
- 緑の線 : 当たった点からEndまで(届かなかった部分)
- 当たった点の印 : Impact Pointの位置
つまり 赤だけで緑が無ければ、何にも当たらず最後まで飛んだ ということです。線がそもそも見えなければ、StartとEndが同じ座標になっています。 当たらない原因の大半は、この一目で分かります。
デバッグ描画はShippingビルドでは取り除かれるため、消し忘れても製品版には出ません。ただしDevelopmentでパッケージすると表示されるので、テスト版を配る前にはパッケージ化の記事の内容と合わせて確認してください。他のデバッグ手段はPrint Stringの記事にまとめています。
実践:見ているものを調べる
ホラーゲームの扉調べ、ARPGの宝箱、脱出ゲームのスイッチ、FPSの拾えるアイテム。 E キーで目の前を調べる 仕組みは、ジャンルを問わず同じ構造で作れます。ここでは、見ているものの名前を画面に表示するところまでを作ります。
完成形
箱のほうを向いて E を押すと、前方へ赤い線が2秒間表示され、画面左上に当たったアクターの名前が出ます。何も無いほうを向いて押すと「なし」と出ます。

再現条件
Third Person テンプレート(Blueprint)で新規プロジェクトを作り、レベルに Cube を2〜3個、キャラクターの前方に置いてください。編集するのは BP_ThirdPersonCharacter です。
このBlueprintに、変数を1つ追加します。
| 変数名 | 型 | 初期値 | 役割 |
|---|---|---|---|
InteractDistance | Float | 300.0 | 調べられる距離(cm) |
変数を作ったら コンパイルしてから初期値を入れてください。 コンパイル前は初期値の欄が編集でき ません。
ノードグラフ
イベントグラフに、次の形を組みます。

文字で追いたいときは、同じ内容がこう書けます。
Event: Keyboard Event「E」(Pressed)
├ Get Actor Location ──────────────────────→ Start
└ Get Actor Forward Vector
→ Multiply(A: Forward Vector, B: InteractDistance)
→ Add(A: Get Actor Location, B: Multiplyの結果)→ End
→ Line Trace By Channel
Start : Get Actor Location
End : Add の結果
Trace Channel : Visibility
Actors to Ignore: Make Array(要素0 = Self)
Draw Debug Type : For Duration
Draw Time : 2.0
→ Branch(Condition: Line Trace の Return Value)
True → Break Hit Result → Hit Actor → Get Display Name → Print String
False → Print String(In String: "なし")
組む順番は次のとおりです。
- グラフの空白を右クリックし、検索欄に
Eと入力して Keyboard Events > E を追加する - 同じく右クリックで
Get Actor LocationとGet Actor Forward Vectorを追加する - Forward Vectorの出力ピンから線を引き、
Multiplyを追加。B側にInteractDistance(変数をCtrlを押しながらドラッグすると取得ノードになる)を繋ぐ Addを追加し、AにGet Actor Location、BにMultiplyの結果を繋ぐLine Trace By Channelを追加し、Start・Endを繋ぐActors to Ignoreの右側にある + を押して要素を1つ増やし、Selfを繋ぐDraw Debug Typeのドロップダウンを For Duration にし、Draw Timeに2.0を入れる- Return Valueから
Branchへ、Out HitからBreak Hit Resultへ繋ぐ - Hit Actorから
Get Display Nameを経由してPrint Stringへ繋ぐ
確認する
Playして、箱の正面に立って E を押してください。
キャラクターの腰の高さから前方へ赤い線が伸び、箱の表面で止まり、そこから先は緑の線になります。同時に画面左上へ Cube_2 のような名前が2秒間表示されれば成功です。 何も無い方向を向いて押すと、線は全部赤いまま最後まで伸び、「なし」と表示されます。
- 線がまったく見えない →
Draw Debug TypeがNoneのまま - 線は出るが必ず「なし」になる → 箱までの距離が300cmより遠い。
InteractDistanceを600.0にして試す - 足元から真上や真下へ線が飛ぶ →
MultiplyのA側にForward Vector以外を繋いでいる - 押しても何も起きない → Keyboard Eventが動いていない。
Print Stringを直接繋いで、イベント自体が呼ばれているか先に確認する - 常に自分の名前が表示される →
Actors to IgnoreにSelfが入っていない
ここで InteractDistance を 50.0 に変えて みてください。箱の目の前まで近づかないと反応しなくなります。この値がそのまま「調べられる範囲」であることが体感できます。
ポイントは2つです。
- Endは自分で計算して渡す: Line Traceに「前方へ300cm」という入力はありません。 位置 + 向き × 距離 を組み立てるのは常に呼び出す側の仕事です。この形さえ覚えれば、銃も接地判定も同じ骨組みで作れます
- 当たった後の処理はInterfaceに逃がす: 実際のゲームでは名前を出して終わりではなく、扉なら開き、宝箱なら中身を出します。相手ごとに
Cast Toを並べると破綻するので、Blueprint Interfaceの記事の方法で「調べられた」というメッセージを送る形にしてください
Multi TraceとShape Trace
基本形が動いたら、変種を2つ知っておくと応用が利きます。

Multi Line Trace By Channel は、当たったものを 配列で 返します。通常のLine Traceが最初の1つで止まるのに対し、こちらは通り道にあるものを拾い集めます。貫通する弾や、レーザーが列に並んだ敵をまとめて焼く処理はこれで作ります。Out Hitsが配列になるので、 For Each Loop で回して処理し ます。
Sphere Trace By Channel は、線ではなく 指定した半径の球を飛ばします。 使いどころは「細い線だと拾えない」場面です。
- 小さな敵に照準が合わせづらいときの、当たり判定の甘さ(エイムアシスト)
- 足元の接地判定で、線1本だと段差の隙間をすり抜けてしまうとき
- 拾えるアイテムを、多少ずれていても検知したいとき
Radius を 30.0 程度から試すと違いが分かります。Box Trace、Capsule Traceも同じ考え方で、飛ばす形が変わるだけです。 ただし線より重いので、まずLine Traceで試して、精度が足りないときだけ置き換えてください。
おまけ:先に知っておくと良いこと
- Tickで毎フレーム撃つのは最後の手段: 接地判定など本当に必要な場面はありますが、多くは入力時やタイマーで十分です。負荷の考え方はTickを減らす設計の記事へ
- Trace Complexは既定でオフ: オンにするとメッシュの実形状で判定しますが、大幅に重くなります。細かい凹凸を拾いたい特別な場面以外は触らないでください
- Break Hit ResultはOut Hitからドラッグすると出る: ノード名で検索するより、Out Hitピンから線を引いて
breakと入力するほうが早く出ます - カメラの位置から撃つと結果が変わる: 三人称視点では、キャラクターの位置から撃った線と、画面中央から撃った線は別方向を向きます。「見えているのに当たらない」ときはこの差が原因です
- 結果を画面に出すならUMGへ:
Print Stringは開発中の確認用です。「調べる」と表示するようなUIを作るときはUMGの記事を参照してください
まとめ
- Line Traceは 見えない線を飛ばして、当たったものを報告してもらう 機能
- Endは自分で計算する。 Start + 向き × 距離 が基本形(単位はcm)
- 遮蔽物や視線は By Channel 、相手の種類で絞るなら By Object Type
- Hit Resultからは Hit Actor / Impact Point / Impact Normal / Distance が取れる
- Draw Debug Type を For Duration にする 。当たらない原因の大半はこれで見える
Actors to IgnoreにSelfを入れるのは書き癖にしてよい- 貫通させたいなら Multi Trace 、判定を甘くしたいなら Sphere Trace
いま作っているゲームで、プレイヤーが「調べたい」と思うものは何でしょうか。まず線を見えるようにして、そこへ届いているか確かめるところから始めてみてください。