目次
はじめに
namiton.hatenablog.jp
UEC++編に続きVerseでのデバッグログの出し方について解説します。
UE4/UE5 でいう PrintString や UE_LOG に近いです。

※UE6mainは2026/06/25現在の情報です。
αですらない開発中のものなので大きく仕様変更される可能性が非常に高いです。
あくまで参考程度に閲覧時点での最新情報をご参照ください。
個人の備忘録としてまとめています。誤った情報がある場合があります。
コメントにてご指摘のほどお願いいたします。
前提として
①UE6のエンジンビルドが済んでいること。
②Verseの実行環境が整っていること。
今回は確認用に、ゲーム開始時にまとめて Print を呼ぶコンポーネントを1つ用意しました。


また、VerseのログはLogVerse系のカテゴリに集約されます。

LogVerseにのみチェックをつけるとVerse以外のログが非表示になるのでおすすめです。

解説
⓪ Print の最小形
一番よく使われるであろう最小構成です。文字列を1つ渡すだけです。
# 一番シンプルな形。色は白、表示は約2秒。
Print("Hello Verse")
これだけで画面に白文字が出て、Output Log にも同じ内容が残ります。
表示時間はデフォルトで約2秒です。
① 色を変える
文字の色は ?Color で指定します。
色は NamedColors に CSS と同じ名前で一通り入っているので、
ここから選ぶのが手軽です。
# 色を変える。NamedColors から名前で選べる。
Print("Green message", ?Color := NamedColors.Green)
受信成功は緑、エラーは赤、のように色で意味を持たせると画面が見やすくなります。
② 表示時間を変える
画面に残る秒数は ?Duration です。
省略すると約2秒。
長めに眺めたいときは大きめの値にします。
# 表示時間を変える。引数を省くとデフォルトの約2秒。
Print("Stay for 10 seconds", ?Color := NamedColors.Yellow, ?Duration := 10.0)
③ 色を自作する
NamedColors に無い色は自分で作れます。
一番手軽なのは16進カラーから作る方法です。
# 色を自作する : 16進カラーから color を作って渡す。
OrangeColor := MakeColorFromHex("FF8800")
Print("Custom orange", ?Color := OrangeColor, ?Duration := 5.0)
④ 文字列以外を出す
Print は文字列だけでなく、任意の値も出せます。
ToDiagnostic で値を包むと、構造体やベクトルでもログに出力できます。
# 文字列以外もそのまま出せる。ToDiagnostic で任意の値を包む。
# vector3 のフィールドは X/Y/Z ではなく Left / Up / Forward。
Pos := vector3{Forward := 1.0, Up := 2.0, Left := 3.0}
Print(ToDiagnostic(Pos))
# 読みやすく整形したいときは ToString を使って文字列に埋め込む。
Print("Pos = {ToString(Pos)}")
この2つは出方が違います。ToDiagnostic は型情報込みの生の姿、ToString は整形済みです。
LogVerse: (/Verse.org/SpatialMath:)vector3{Forward := 1.0, Left := 3.0, Up := 2.0}
LogVerse: Pos = {Forward = 1.000000, Left = 3.000000, Up = 2.000000}
サッと中身を見たいなら ToDiagnostic、ログや画面を読みやすくしたいなら ToString、と使い分けると良いです。
実行結果のスクショ

⑤ ログレベルを使い分ける(Verbose 相当)
UE_LOG の Verbose のような、ログの重要度の使い分けについて。
グローバルの Print にはレベル指定の引数がありません。
レベルを分けたいときは log クラス経由で出します。
エンジンが公開している定義を抜き出すとこうなっています。
# /UnrealEngine.com/Temporary/Diagnostics 内の定義(抜粋)
log_level := enum:
Debug
Verbose
Normal
Warning
Error
log := class:
Channel:subtype(log_channel)
DefaultLevel:log_level
Print(Message:string, ?Level:log_level):void
PrintCallStack(?Level:log_level):void
log_level は Debug / Verbose / Normal / Warning / Error の5段階。
これが Verbose に相当する正体です。
実際に使うときは、チャンネルを定義して log を作り、レベルを添えて Print します。log_channel は abstract なので、空の子クラスを1つ用意します。
# ① ログチャンネルを1つ定義(log_channel は abstract なので空の子クラスを作る)。
printlog_channel := class(log_channel){}
# ② log を作り、使うチャンネルを指定する。
Logger := log{Channel := printlog_channel}
# ③ レベルを付けて出力する。Verbose は既定では出ないので注意(後述)。
Logger.Print("verbose 相当のログ", ?Level := log_level.Verbose)
Logger.Print("警告ログ", ?Level := log_level.Warning)
# ④ 呼び出し元のコールスタックも出せる。
Logger.PrintCallStack()
実行すると、色付きの画面表示ではなく Output Log の方に流れます。
log 経由のログには行頭にチャンネル名(printlog_channel:)が付くのが、
グローバル Print との違いです。

最初は Verbose の行が出ていませんでした。
ログレベルは普段は表示されず、より詳細なログを表示したいときのみの仕組みなので、Verbose は既定で抑制されます。
出したいときは、コマンドからカテゴリの詳細度を上げると次回以降Verboseの内容が表示できます。

こうすることで先ほどは出ていなかったVerboseのログを出すことができました。

デフォルトの表示に戻すときは
末尾の PrintCallStack は、その時点の呼び出し履歴を出してくれます。
ここでは OnBeginSimulation から呼んだことが分かります。
原因を追うときに地味に役立ちます。
※ log まわりの記法は、手元の UE6 main では動作を確認済みです。
ただし開発中のため、将来のバージョンで変わる可能性はあります。
⑥ 文字サイズは Print にない(DrawText)
色と時間は出せますが、文字サイズの引数は Print にはありません。
大きく出したいときは、用途は少し違いますが、
デバッグ描画の DrawText を使います。
3D空間の座標に文字を描くもので、FontScale でサイズを変えられます。
debug_draw は ⑤ の log と同じ Diagnostics モジュールにあり、
チャンネルを定義して使うところまで作りがそっくりです。
# モジュールスコープ : debug_draw のチャンネル(abstract なので空の子クラス)。
printlog_draw_channel := class(debug_draw_channel){}
# --- OnBeginSimulation の中 ---
Drawer := debug_draw{Channel := printlog_draw_channel}
# これが無いと描画が出ない(カスタム channel は既定で非表示)。
Drawer.ShowChannel()
# 自分の親エンティティ(プレハブ)のワールド座標を取り、少し上にずらす。
MyTransform := Entity.GetGlobalTransform()
TextPos := MyTransform.Translation + vector3{Forward := 0.0, Up := 150.0, Left := 0.0}
# ?FontScale でサイズ、?DrawDropShadow で影。Persistent で消えずに残す。
Drawer.DrawText("Big Verse Text", TextPos,
?Color := NamedColors.Cyan, ?FontScale := 4.0, ?DrawDropShadow := true,
?DrawDurationPolicy := debug_draw_duration_policy.Persistent)
ここで実際に2つハマったので共有します。
ShowChannel() を呼ばないと何も出ません。
カスタムのチャンネルは既定で非表示で、
表示するには明示的に ShowChannel() が要ります。
試しに消したら、文字も丸ごと消えました。
DrawDurationPolicy を Persistent にしないと、1フレームで消えます。 OnBeginSimulation で1回描くだけだと、
既定の SingleFrame 扱いで一瞬で消えてしまい、最初はずっと見えませんでした。?Duration を渡しても policy が SingleFrame だと効きません。
この2つを押さえると、プレハブの頭上に大きなシアンの文字が出ます。Print と違って3Dワールド空間の文字なので、そのオブジェクトが画角に入っていないと映らない点も注意です。
⑦ 全文と動かし方
ここまでをまとめたコンポーネント printlog.verse の全文です。
using { /Verse.org } # Print / ToDiagnostic など基本機能
using { /Verse.org/Native } # ネイティブ連携
using { /Verse.org/SceneGraph } # component / entity など SceneGraph の中核
using { /Verse.org/Simulation } # シミュレーション(ゲーム実行)関連
using { /Verse.org/Colors } # NamedColors / MakeColorFrom...(Print の色指定)
using { /Verse.org/SpatialMath } # vector3(④⑥ で使用)
using { /UnrealEngine.com/Temporary/Diagnostics } # log / debug_draw(⑤⑥ で使用)
# ============================================================================
# printlog_channel : log のチャンネル。log_channel は abstract なので、
# 空の子クラスを1つ作る。出力時に行頭へ [printlog_channel] が前置される。
# ============================================================================
printlog_channel := class(log_channel){}
# ============================================================================
# printlog_draw_channel : debug_draw のチャンネル。log と同じく
# debug_draw_channel が abstract なので、空の子クラスを1つ作る。
# ============================================================================
printlog_draw_channel := class(debug_draw_channel){}
# ============================================================================
# printlog : Verse の Print を一通り試すデモ用コンポーネント。
# エンティティ(プレハブ)に貼り付けて実行すると、OnBeginSimulation の
# 中身が上から順に走り、画面と Output Log に文字が出る。
# ============================================================================
printlog<public> := class<final_super>(component):
# ------------------------------------------------------------------------
# OnBeginSimulation : ゲーム開始時にエンジンが自動で呼ぶライフサイクル関数。
# <override> で親 component の同名関数を上書きする。
# まず (super:)OnBeginSimulation() で親の初期化を済ませてから、
# 自分の処理(各種 Print)を実行するのがお約束。
# ------------------------------------------------------------------------
OnBeginSimulation<override>():void =
(super:)OnBeginSimulation()
# ⓪ 最小形 : 文字列を1つ渡すだけ。色は白、表示は約2秒。
# 画面表示と同時に Output Log にも同じ内容が残る。
Print("Hello Verse")
# ① 色を変える : ?Color に NamedColors の色を渡す。
Print("Green message", ?Color := NamedColors.Green)
# ② 表示時間を変える : ?Duration に秒数を渡す。省略時は約2秒。
Print("Stay for 10 seconds", ?Color := NamedColors.Yellow, ?Duration := 10.0)
# ③ 色を自作する : 16進カラーから color を作って渡す。
OrangeColor := MakeColorFromHex("FF8800")
Print("Custom orange", ?Color := OrangeColor, ?Duration := 5.0)
# ④ 文字列以外を出す
# vector3 のフィールドは X/Y/Z ではなく Left / Up / Forward(UE6 の SceneGraph 系)。
Pos := vector3{Forward := 1.0, Up := 2.0, Left := 3.0}
# ToDiagnostic : 任意の値をそのままログへ出せる。
Print(ToDiagnostic(Pos))
# 普段使いは ToString で文字列に整形して埋め込むのが読みやすい。
Print("Pos = {ToString(Pos)}")
# ⑤ ログレベル(Verbose 相当)を使い分ける
# グローバルの Print には Level 引数が無い。レベルを分けたいときは
# log を作り、?Level にレベルを添えて出力する。
Logger := log{Channel := printlog_channel}
Logger.Print("verbose 相当のログ", ?Level := log_level.Verbose)
Logger.Print("警告ログ", ?Level := log_level.Warning)
# 呼び出し元のコールスタックも出せる。
Logger.PrintCallStack()
# ⑥ 文字サイズを変えて3D文字を描く
# Print にはサイズ指定が無い。大きく出したいときは debug_draw の DrawText を使う。
# debug_draw も log と同じ Diagnostics モジュール。チャンネル→生成→描画の流れも同じ。
Drawer := debug_draw{Channel := printlog_draw_channel}
# チャンネルを表示状態にする。これが無いとカスタム channel の描画は出ない(消すと消滅するのを確認済み)。
Drawer.ShowChannel()
# 自分の親エンティティ(プレハブ)のワールド座標を取り、少し上にずらして頭上に出す。
MyTransform := Entity.GetGlobalTransform()
TextPos := MyTransform.Translation + vector3{Forward := 0.0, Up := 150.0, Left := 0.0}
# ?FontScale でサイズ、?DrawDropShadow で影。Persistent で消えずに残す(1フレームで消えるのを防ぐ)。
Drawer.DrawText("Big Verse Text", TextPos,
?Color := NamedColors.Cyan, ?FontScale := 4.0, ?DrawDropShadow := true,
?DrawDurationPolicy := debug_draw_duration_policy.Persistent)
これを EntityPrefab に付けてレベルに配置し、実行すると次のように画面へ出ます。
並びは新しいものが上です。下から Hello Verse → Green → Yellow → Orange と色が変わり、上の2行が ④ の出力です。⑤ のログは Output Log、⑥ の大きい文字は3D空間のプレハブ頭上に出ます。


最後に
UE4やUE5向けの記事を書いています。
皆様の応援が投稿のモチベーションになりますので
コメントやX(Twitter)のフォローなどしていただけるとありがたいです。
それではよきゲーム開発を。
投げ銭を投げる