【Unreal Engine】Draw DebugとVisual Loggerで見えないものを見る:範囲・向き・軌跡を画面に描く

作成: 2026-07-25

Sphere Radius 800が実際どこまでなのかは、目で見ないと分かりません。Draw Debug Sphere/Line/Cone/Stringの使い方、Durationの意味、エディタ標準の表示との使い分け、そしてVisual Loggerで後から巻き戻す方法を図解。AIが反応しない原因を可視化で突き止める実践つき。

Sphere Radius = 800 と書いた。でも、800がどこまでなのかは分かりません。敵の視界を120度に設定した。でも、その扇形が実際どこを向いているのかも見えません。

Print String は値を教えてくれますが、空間の情報は文字では分かりません800 という数字と、目の前の壁までの距離が一致するのかどうかは、描いてみるまで分からないのです。この記事では、範囲や向きをゲーム画面の中に描く Draw Debug 系ノードと、後から巻き戻して見る Visual Logger を解説します。

敵の周りに検知範囲の球と視界の扇形が描かれ、届いていないことが一目で分かる様子とソフトブルーのクレイ人形

この記事でわかること

  • 数字と、見えている範囲は一致しない
  • Draw Debug Sphere / Line / Box / Arrow / Cone / String
  • Duration の意味 (Tickから呼ぶなら 0
  • 自分で描く前に エディタ標準の表示 で足りることも多い
  • Visual Logger で後から巻き戻す
  • 実践: AIが反応しない原因を、可視化で突き止める

Sponsored

数字は、距離を教えてくれない

Sphere CollisionSphere Radius800 と入れる。敵の SightRange1200 にする。この数字が、ゲーム世界のどこまでなのかは、書いた本人にも分かりません。

UEの単位は1つが1cmなので、800 は8メートルです。でも「8メートル」と言われて、目の前の廊下の何割かが即答できる人はほとんどいません。

Sphere Radius 800という数字だけを見ても範囲が分からないのに対し、球を描くと壁まで届いていないことが一目で分かることを左右で対比した図

そしてバグの多くは、この「思っていた範囲」と「実際の範囲」のズレから生まれます

  • 敵が反応しない → 検知範囲が思ったより狭かった
  • 敵が壁越しに反応する → 検知範囲が思ったより広かった
  • 攻撃が当たらない → 攻撃判定の球がキャラの中に埋まっていた

こうしたとき、Print String800 と表示しても何も進みません。描いて、目で見るのがいちばん速い解決です。


Draw Debug系ノード

Blueprintで Draw Debug と検索すると、図形ごとにノードが並びます。よく使うのは6つです。

Draw Debug Sphere・Line・Box・Arrow・Cone・Stringのそれぞれが何を描くかを、6つのカードに並べて示した図
ノード描くもの使いどころ
Draw Debug Sphere検知範囲・攻撃範囲。いちばん出番が多い
Draw Debug Line「AからBへ」の関係。ターゲットとの結び
Draw Debug Box直方体部屋の範囲、Kill Volumeの位置
Draw Debug Arrow矢印向き。移動方向、ノックバックの方向
Draw Debug Cone円錐視界。扇形の検知範囲
Draw Debug String世界の中の文字Actorの真上に状態を出す

ピンはどれも似ています。位置(と大きさ)・色・太さ・Duration の4種類だけ押さえれば使えます。

Draw Debug String は特に便利です。 Print String が画面の左上にまとめて出るのに対し、これはそのActorの真上に文字を出せます。敵が10体いても、「どの敵が今どの状態か」を1体ずつ頭の上に表示できます(→ enumとステートマシン)。

Line Trace専用の描画もあります。 Line Trace by Channel などのノードには Draw Debug Type というピンがあり、そこで For Duration を選ぶとトレースの線と当たった点が自動で描かれます。トレースの確認はこちらのほうが簡単なので、使い分けてください(→ Line Traceの記事)。この記事の Draw Debug 系は、トレース以外の何でも描ける汎用の道具です。

Sponsored

Durationとどこから呼ぶか

Draw Debugでいちばん引っかかるのが、描いたのに一瞬で消えるという現象です。

原因は Duration です。既定は 0 で、これは「1フレームだけ描く」という意味になります。

Duration 0はTickから毎フレ��ーム呼ぶと描き続けられ、BeginPlayから1回呼ぶだけだと1フレームで消えることを対比した図

呼ぶ場所によって、正しい設定が変わります。

呼ぶ場所Duration結果
Event Tick(毎フレーム)0 のまま毎フレーム描き直されるので、ずっと見えている
Event BeginPlay(1回だけ)10.0 などの秒数その秒数だけ残る
Event BeginPlay(ずっと残したい)Persistent Lines をオン消えない(Flush Persistent Debug Lines で消す)

「動くものを追う」なら Tick、「動かないものを確認する」なら BeginPlay と覚えてください。

  • 敵の検知範囲(敵と一緒に動く)→ Event Tick から Duration = 0
  • 部屋のトリガー範囲(動かない)→ Event BeginPlay から Persistent Lines をオン

Tickから呼ぶことに抵抗があるかもしれませんが、デバッグ表示は確認が終わったら消すものなので、この用途に限ってはTickで構いません(→ Tickに頼らない設計)。


先にエディタの表示を試す

自分で描き始める前に、エディタが最初から持っている表示で足りないか確認してください。作る手間ゼロで見られます。

見たいもの方法
コリジョンの形ビューポートの 表示(Show)→ コリジョン、またはPlay中に Show Collision
NavMesh(AIが歩ける範囲)ビューポートで P キー
ライトの影響範囲ライトActorを選択すると、範囲がワイヤーフレームで出る
コンポーネントの範囲Sphere / Box Collisionは選択するだけで形が見える

いちばん見落とされるのが最後の1つです。 Sphere Collision コンポーネントは、Blueprintエディタやレベル上で選択すれば範囲が表示されますSphere Radius を変えれば、その場で大きさが変わるのが見えます。

つまり、単純なコリジョンの大きさを確認するだけなら Draw Debug は要りません。Draw Debugが要るのは、次のような場面です。

  • Play中に、動きながら範囲を見たい
  • コンポーネントではなく、コードの中の数値SightRange 変数など)を可視化したい
  • 計算結果Find Look at Rotation が向いている方向など)を確認したい

Visual Loggerで巻き戻す

Draw Debugは「今この瞬間」を描きます。困るのは、見たい瞬間が一瞬で過ぎてしまうときです。

「敵が一瞬だけこちらを向いて、すぐ戻った。あのとき何を見ていたのか」——こういう調査に使うのが Visual Logger です。

Draw Debugは今の瞬間だけを描くのに対し、Visual Loggerはタイムライン付きで記録して後から任意の時点へ巻き戻せることを対比した図

時間軸つきで記録し、後からスライダーを動かして任意の瞬間を見るツールです。特にAIのデバッグで力を発揮します。UEのAI関連(AI PerceptionBehavior Tree)は、最初からVisual Loggerへ記録を送っています。自分で仕込まなくても、開けば見えます。

使い方の骨格だけ押さえてください。

  1. ウィンドウ → Visual Logger で開く
  2. 記録ボタンを押してからPlayする
  3. 止めると、下部にタイムラインが出る
  4. 左のリストで AIのActorを選び、スライダーを動かす

すると、その時刻にAIが何を感知していたか・どこへ向かおうとしていたかが3Dビューに再現されます。

UIは独特で、最初は戸惑います。 ただ「そういう道具がある」と知っているかどうかで、AIのデバッグにかかる時間がまったく変わります。Draw Debugで足りなくなったら思い出してください。

Sponsored

実践:AIが反応しない原因を突き止める

ステルスゲームの見張り、ホラーゲームの徘徊者、タワーディフェンスの索敵タレット。「敵が反応してくれない」 はAIを作れば必ず一度は踏みます。ここでは可視化だけで原因を特定します。

再現する状態を作る

用意するもの内容
BP_GuardStatic Meshを持つActor。レベルに1体置く
変数 SightRangeFloat / 既定値 800.0
変数 SightAngleFloat / 既定値 45.0(片側の角度)
判定Event Tick で、プレイヤーとの距離が SightRange 以内かつ、正面から SightAngle 以内なら Print String("発見")
配置BP_Guard正面 1000 の位置 にプレイヤーが立てるようにする

この状態でPlayすると、プレイヤーが目の前にいるのに「発見」が出ません。数字を見ても理由は分かりません。描いて確かめます。

検知範囲の球と視界の扇形を描いた結果、プレイヤーが球の外側に立っていることが一目で分かり、SightRangeを伸ばすと届く様子を示した実例図

可視化を足す

BP_GuardEvent Tick に、描画を2つ足します。

  1. Draw Debug SphereCenterGet Actor LocationRadiusSightRangeSegments = 16Line ColorDuration = 0
  2. Draw Debug ConeOriginGet Actor LocationDirectionGet Actor Forward VectorLengthSightRangeAngle WidthAngle HeightSightAngle(度をラジアンに変換して入れる)、Line ColorDuration = 0
上段「範囲を描く」でEvent Tick→Get Actor Location→Draw Debug Sphere、下段「向きを描く」でGet Actor Forward Vector→Draw Debug Cone→Draw Debug Stringへ折り返す2段組みの完成ノードグラフ
BP_Guard(イベントグラフ)
Event Tick
  → loc = GetActorLocation()
  → DrawDebugSphere(
        Center   = loc,
        Radius   = SightRange,
        Segments = 16,
        LineColor = 青,
        Duration = 0.0)
  → DrawDebugCone(
        Origin      = loc,
        Direction   = GetActorForwardVector(),
        Length      = SightRange,
        AngleWidth  = SightAngle(ラジアン),
        AngleHeight = SightAngle(ラジアン),
        LineColor   = 黄,
        Duration    = 0.0)
  → DrawDebugString(
        TextLocation = loc + (0, 0, 120),
        Text         = "Range: " + SightRange,
        Duration     = 0.0)

確かめる

Playすると、見張りの周りに青い球と、正面へ伸びる黄色い扇形が出ます。ここで一目で分かるのが、プレイヤーが青い球の外側に立っていることです。

SightRange800 、プレイヤーは 1000 の位置。200足りていません。 Print String を何度足しても「発見」が出なかった理由が、絵で1秒で分かります。

SightRange1200 に変えてもう一度Playしてください。今度は球がプレイヤーを包み込み、「発見」が出ます。範囲が届いたことが目で確認できます。

続けて、プレイヤーを見張りの真横へ移動させてください。球の中には入っているのに「発見」が出ないはずです。黄色い扇形の外側にいるからです。SightAngle45 から 90 に変えると、扇形が広がって反応します。

うまくいかないときの切り分けです。

  • 何も描かれないDuration0 のまま Event BeginPlay から呼んでいます。Tickへ移すか、Duration に秒数を入れてください
  • 球は出るが扇形が出ないDraw Debug Cone の角度は ラジアン です。度をそのまま入れると極端な形になります。Degrees To Radians を挟んでください
  • 地面に埋まって見えないGet Actor Location はActorの中心です。+ (0, 0, 50) などで少し持ち上げると見やすくなります

ポイントは2つです。

  • 数字を疑う前に、描いて確かめる: 「範囲が足りない」のか「向きが違う」のかは、絵にすれば1秒で分かります。Print String を増やして推測するより速いです
  • 確認が終わったら消す: Draw Debugは描画コストがかかります。原因が分かったらノードを消すか、bShowDebug のようなbool変数で Branch を挟んで切れるようにしておきます

範囲ではなく値の変化を追いたくなったら、実行を止めて中身を覗く Blueprint Debugger が次の担当です。


おまけ:先に知っておくと良いこと

Shipping版では描かれない。 Draw Debug 系は Development ビルドでのみ描画され、Shipping ビルドでは何も出ません。消し忘れても製品に出ないので安心ですが、逆に「製品でも見せたい範囲表示」には使えません。その用途にはDecalや半透明マテリアルを使ってください。

描きすぎると重い。 敵が100体いて全員が毎フレーム球と扇形を描けば、それだけで負荷になります。調査対象だけに絞って描いてください。bShowDebug のようなbool変数を1つ用意し、Branch で切れるようにしておくと便利です。

Segments は見た目と負荷のつまみ。 Draw Debug SphereSegments は球の分割数です。既定の 12 でも十分見えますが、24 にすると滑らかになります。ただし線の数が増えるので、たくさん描くときは小さめにしてください。

色は意味で決めると読みやすい。 「検知範囲は青、視界は黄、攻撃範囲は赤」のように役割ごとに色を固定しておくと、複数の範囲を同時に描いても混乱しません。ルールは自分の中だけで通じれば十分です。


まとめ

  • 数字と、見えている範囲は一致しない 。バグの多くはこのズレから生まれる
  • よく使うのは Sphere(範囲)・Cone(視界)・Arrow(向き)・String(頭上の文字)
  • Duration は呼ぶ場所で決める 。Tickなら 0 、BeginPlayなら秒数か Persistent Lines
  • 自分で描く前に、コンポーネントを選択する・Show CollisionP キー で足りないか確認する
  • 見たい瞬間が一瞬で過ぎるなら Visual Logger で巻き戻す

「反応しない」の原因は、たいてい範囲か向きのどちらかです。次にAIが動いてくれないとき、まず何を描いて確かめますか。