【Unreal Engine】UE5のLine Trace入門:見えない線で「そこに何があるか」を調べる

作成: 2026-07-20

UE5のLine Traceを図解。By ChannelとBy Object Typeの違い、StartとEndの作り方、Hit Resultから取れる情報、Draw Debug Typeでの可視化、Multi TraceとSphere Traceの使いどころまで。

目の前のドアを調べたい。銃を撃って当たった相手を知りたい。足元が床か崖かを判定したい。どれもやりたいことは違いますが、必要な処理は同じです。 ある地点からある方向へ線を伸ばして、最初にぶつかったものを教えてもらう ことです。

UE5でこれを担当するのが Line Trace です。他のエンジンではレイキャスト(Raycast)と呼ばれる機能にあたります。この記事では、Line Traceの基本形から、当たった結果に含まれる情報、そして組んだトレースを目で確認する方法までを解説します。

前方へ伸びる線が箱に当たり、当たった点が光っている図と、ソフトブルーのクレイ人形

この記事でわかること

  • Line Traceは 見えない線を飛ばして、当たったものを調べる 機能
  • By ChannelBy Object Type の使い分け
  • StartとEndの作り方( 位置 + 向き × 距離
  • Hit Result から取れる4つの情報
  • Draw Debug Type で線を見えるようにする
  • 実践: 見ているものの名前を画面に出すインタラクト機能

Sponsored

Line Traceとは何か

Line Traceは、 レベルの中に一瞬だけ見えない線を引いて、その線に触れたものを報告してもらう 機能です。線そのものは物理的な存在ではなく、当たった相手を押したりもしません。あくまで問い合わせです。

Startから前方へ線が伸び、途中の箱にぶつかって止まり、その先には届いていないことを示した図

必要なのは3つだけです。

入力意味
Start線の始点(ベクトル)
End線の終点(ベクトル)
Trace Channel / Object Types何を対象に調べるか

結果として返ってくるのが2つです。

出力意味
Return Value(Boolean)何かに当たったかどうか
Out Hit(Hit Result)当たったものの詳細一式

用途の広さがこの機能の特徴です。銃のヒットスキャン、視線が通っているかの判定、足元の接地確認、マウスカーソルの先にあるものの取得。 形は全部この3入力・2出力 で、変わるのはStart/Endの作り方と、当たった後にやることだけです。

Sponsored

StartとEndを作る

Line Traceで最初につまずくのがStartとEndです。「前方へ200cm」と書きたいのに、必要なのは2つの座標だからです。

答えは、次の式をそのままノードにすることです。

End = Start + (向きのベクトル × 距離)
Get Actor LocationがStartになり、Forward Vectorに距離を掛けた値を足した先がEndになることを示したベクトル図

Blueprintでは、こう組みます。

作るもの使うノード
StartGet 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 LocationGet Forward Vector 、コントローラーの向きなら Get Control RotationGet Forward Vector に通します。 式の形は変わりません。


By ChannelとBy Object Typeの違い

Line Traceのノードは何種類かありますが、まず覚えるのは2つです。

左は視線が通るかを調べるBy Channel、右は敵だけを拾うBy Object Typeを対比した図
ノード調べ方向いている用途
Line Trace By Channel指定したチャンネルに Block と設定されているもの を探す遮蔽物の有無、視線判定、銃撃
Line Trace By Object Type指定した 物体の種類 (WorldStatic / Pawn / PhysicsBody など)を探す敵だけ拾う、動く物だけ拾う

By Channel は「壁でも箱でも敵でも、とにかく間に何かあるか」を知りたいときの道具です。既定で使えるチャンネルは VisibilityCamera の2つで、迷ったら Visibility を選びます。

By Object Type は「何が」で絞ります。Object Typesの配列に Pawn だけを入れれば、壁を無視してキャラクターだけを拾います。

どちらを選んでも、 各アクターのコリジョン設定が最終的な判定を決めます。 「絶対に当たるはずの壁に当たらない」ときは、トレース側ではなく相手のコリジョン設定を見てください。自分専用のチャンネルを追加する方法はコリジョンプロファイルの記事で扱っています。当たり判定そのものの形についてはSimple/Complexコリジョンの記事も合わせてどうぞ。

Actors to Ignoreに自分を入れる

どのトレースノードにも Actors to Ignore という配列の入力があります。ここに入れたアクターは、線が触れても無視されます。

始点を自分の位置にする以上、線は自分の内側から出発します。 自分のコリジョンが対象チャンネルをBlockしていると、出発した瞬間に自分自身へ当たって終わります。 既定のPawnプロファイルは Visibility を無視する設定なので必ず起きるわけではありませんが、コリジョン設定を自分で変えた途端に発生します。

Make ArraySelf を1つ入れて Actors to Ignore へ繋ぐ。 これは書き癖にしてしまって構いません。 害はなく、原因の分かりにくいバグを1つ丸ごと消せます。

Sponsored

Hit Resultから取れる情報

当たったとき、 Out Hit には情報が詰まった構造体が入っています。 Break Hit Result ノードに繋ぐと中身が展開されます。よく使うのは4つです。

Break Hit Resultから伸びるHit Actor・Impact Point・Impact Normal・Distanceの4つを、当たった箱の図の上に対応づけた図
ピン内容使いどころ
Hit ActorActor参照当たったアクター本体相手が誰かを調べる、ダメージを送る
Impact PointVector線が表面に触れた座標弾痕やエフェクトを出す位置
Impact NormalVectorその面の向き(垂直なベクトル)弾痕を壁に沿って貼る、斜面の角度を知る
DistanceFloatStartからImpact Pointまでの距離射程内かどうかの判定

Impact Normal は最初分かりにくいですが、 当たった面がどちらを向いているか を表す矢印です。床に当たれば真上、壁に当たれば横向きになります。エフェクトの回転をこの値に合わせると、弾痕が面にぴったり貼り付きます。

Hit Component (当たったコンポーネント)や Hit Bone Name (当たったボーン名)も取れます。ボーン名が分かるということは、 頭に当たったか胴に当たったかを区別できる ということです。ヘッドショット判定はここを見て作ります。

補足: LocationImpact Point という似たピンが並んでいます。Line Traceではどちらも同じ値になりますが、後述するSphere Traceでは意味が分かれます。 Impact Point は表面に触れた点、 Location は接触したときの球の中心です。

Draw Debug Typeで線を見る

Line Traceは目に見えません。当たらないときに何を疑えばいいのか分からないのは、そのためです。

トレース系のノードには Draw Debug Type という入力があり、ここを変えると 線が画面に描かれます。

挙動
None何も描かない(既定)
For One Frame1フレームだけ描く。Tickで毎回撃つとき用
For DurationDraw Time で指定した秒数だけ残る
Persistent消えずに残り続ける
Draw Debug TypeをFor Durationにしたときの表示。始点から当たった点までが赤、その先が緑、当たった点に印がつく

For Duration に設定し、 Draw Time2.0 にするのが最初の一手です。描かれる線には意味があります。

  • 赤い線 : Startから当たった点まで
  • 緑の線 : 当たった点からEndまで(届かなかった部分)
  • 当たった点の印 : Impact Pointの位置

つまり 赤だけで緑が無ければ、何にも当たらず最後まで飛んだ ということです。線がそもそも見えなければ、StartとEndが同じ座標になっています。 当たらない原因の大半は、この一目で分かります。

デバッグ描画はShippingビルドでは取り除かれるため、消し忘れても製品版には出ません。ただしDevelopmentでパッケージすると表示されるので、テスト版を配る前にはパッケージ化の記事の内容と合わせて確認してください。他のデバッグ手段はPrint Stringの記事にまとめています。

Sponsored

実践:見ているものを調べる

ホラーゲームの扉調べ、ARPGの宝箱、脱出ゲームのスイッチ、FPSの拾えるアイテム。 E キーで目の前を調べる 仕組みは、ジャンルを問わず同じ構造で作れます。ここでは、見ているものの名前を画面に表示するところまでを作ります。

完成形

箱のほうを向いて E を押すと、前方へ赤い線が2秒間表示され、画面左上に当たったアクターの名前が出ます。何も無いほうを向いて押すと「なし」と出ます。

キャラクターが箱を向いてEキーを押すと赤い線が伸びて箱に当たり、画面左上にCube_2と表示される図

再現条件

Third Person テンプレート(Blueprint)で新規プロジェクトを作り、レベルに Cube を2〜3個、キャラクターの前方に置いてください。編集するのは BP_ThirdPersonCharacter です。

このBlueprintに、変数を1つ追加します。

変数名初期値役割
InteractDistanceFloat300.0調べられる距離(cm)

変数を作ったら コンパイルしてから初期値を入れてください。 コンパイル前は初期値の欄が編集できません。

ノードグラフ

イベントグラフに、次の形を組みます。

EキーイベントからLine Trace By Channelを呼び、Branchで分岐してPrint Stringへ繋ぐノードグラフ全体図

文字で追いたいときは、同じ内容がこう書けます。

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: "なし")

組む順番は次のとおりです。

  1. グラフの空白を右クリックし、検索欄に E と入力して Keyboard Events > E を追加する
  2. 同じく右クリックで Get Actor LocationGet Actor Forward Vector を追加する
  3. Forward Vectorの出力ピンから線を引き、 Multiply を追加。B側に InteractDistance (変数を Ctrl を押しながらドラッグすると取得ノードになる)を繋ぐ
  4. Add を追加し、AにGet Actor Location、BにMultiplyの結果を繋ぐ
  5. Line Trace By Channel を追加し、Start・Endを繋ぐ
  6. Actors to Ignore の右側にある を押して要素を1つ増やし、 Self を繋ぐ
  7. Draw Debug Type のドロップダウンを For Duration にし、 Draw Time2.0 を入れる
  8. Return Valueから Branch へ、Out Hitから Break Hit Result へ繋ぐ
  9. Hit Actorから Get Display Name を経由して Print String へ繋ぐ

確認する

Playして、箱の正面に立って E を押してください。

キャラクターの腰の高さから前方へ赤い線が伸び、箱の表面で止まり、そこから先は緑の線になります。同時に画面左上へ Cube_2 のような名前が2秒間表示されれば成功です。 何も無い方向を向いて押すと、線は全部赤いまま最後まで伸び、「なし」と表示されます。

  • 線がまったく見えないDraw Debug TypeNone のまま
  • 線は出るが必ず「なし」になる → 箱までの距離が300cmより遠い。InteractDistance600.0 にして試す
  • 足元から真上や真下へ線が飛ぶMultiply のA側にForward Vector以外を繋いでいる
  • 押しても何も起きない → Keyboard Eventが動いていない。 Print String を直接繋いで、イベント自体が呼ばれているか先に確認する
  • 常に自分の名前が表示されるActors to IgnoreSelf が入っていない

ここで InteractDistance50.0 に変えて みてください。箱の目の前まで近づかないと反応しなくなります。この値がそのまま「調べられる範囲」であることが体感できます。

ポイントは2つです。

  • Endは自分で計算して渡す: Line Traceに「前方へ300cm」という入力はありません。 位置 + 向き × 距離 を組み立てるのは常に呼び出す側の仕事です。この形さえ覚えれば、銃も接地判定も同じ骨組みで作れます
  • 当たった後の処理はInterfaceに逃がす: 実際のゲームでは名前を出して終わりではなく、扉なら開き、宝箱なら中身を出します。相手ごとに Cast To を並べると破綻するので、Blueprint Interfaceの記事の方法で「調べられた」というメッセージを送る形にしてください

Multi TraceとShape Trace

基本形が動いたら、変種を2つ知っておくと応用が利きます。

左は複数の敵を貫通するMulti Trace、右は太い球で拾うSphere Traceを対比した図

Multi Line Trace By Channel は、当たったものを 配列で 返します。通常のLine Traceが最初の1つで止まるのに対し、こちらは通り道にあるものを拾い集めます。貫通する弾や、レーザーが列に並んだ敵をまとめて焼く処理はこれで作ります。Out Hitsが配列になるので、 For Each Loop で回して処理します。

Sphere Trace By Channel は、線ではなく 指定した半径の球を飛ばします。 使いどころは「細い線だと拾えない」場面です。

  • 小さな敵に照準が合わせづらいときの、当たり判定の甘さ(エイムアシスト)
  • 足元の接地判定で、線1本だと段差の隙間をすり抜けてしまうとき
  • 拾えるアイテムを、多少ずれていても検知したいとき

Radius30.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 IgnoreSelf を入れるのは書き癖にしてよい
  • 貫通させたいなら Multi Trace 、判定を甘くしたいなら Sphere Trace

いま作っているゲームで、プレイヤーが「調べたい」と思うものは何でしょうか。まず線を見えるようにして、そこへ届いているか確かめるところから始めてみてください。