ゲーム開発備忘録

ゲームプログラマー UE4・5向けの記事を書いておりますので見ていただけるとありがたいです。

【UnrealEngine】〈Tips〉FabでUEプラグインを販売する完全攻略

目次

 

はじめに

Fabでプラグインを公開するとき、UEバージョンの登録まわりがよく分からなかったので、備忘録として残します。

投稿時点での設定なので、今はUIがもっと設定しやすくなっているかもしれません。

 

個人の備忘録としてまとめています。誤った情報がある場合があります。

コメントにてご指摘のほどお願いいたします。

 

セラーの登録

ここは割愛します。

Fabの公開タブから、自分の住所・税務情報などを記載して、販売できる状態にしておきましょう。

www.fab.com

 

出品登録

セラーの審査に通ると、アセットを公開できるようになります。

まずは「新規に出品する」を押します。

 

製品種類の選択が出るので、販売したいタイプに合わせて選びましょう。

 

今回はUEエディタ用のプラグインなので、ツール・プラグインを選びました。

 

出品編集

ここではアイテムの商品名・説明・金額・画像を登録していきます。

右上の「出品プレビュー」から、実際に販売されたときの見た目を確認できます。

 

① タイトル

ストアに表示されるアイテム名です。

 

② 説明

ページに入ったときに見える説明文です。

序盤以外は折りたたまれてしまうので、目に付きやすい順に上から並べるのがおすすめです。

 

・どんなプラグインなのか?
・ドキュメントや紹介動画のリンク
・機能一覧
・サポート(問い合わせ先)

 

ドキュメント類は、シークレットウインドウなどで他人でも閲覧できる状態になっているか確認しておきましょう。

GithubやNotionなどがおすすめです。

https://hexagonal-town-f82.notion.site/RecentAssetHistory-Document-36874cd1eb3e805bb5d2fc4ce33f8aea?pvs=143

 

サポートはメールやDiscordなどがあると便利です。

プラグイン側にSupportURLが必要なので、自分はDiscordサーバーを作っておきました。

(荒らし対策やサポート向けに、CarlやTicketToolなどのBotを導入するとより便利です。)

 

③ 製品の種類

出品登録で選んだものが入っているはずです。

あとから変えたい場合はここで設定しましょう。

 

④ カテゴリー

販売するものに応じて決めましょう。

 

⑤ 価格設定

ライセンスや金額を設定するところです。

USD登録ですが、プレビューから日本円での金額を確認できるので、調整しておきましょう。

 

⑥ タグ

より多くの人に見つけてもらうために、積極的に登録しましょう。

 

⑦ サムネイル

1920×1080の制約があるので気を付けましょう。

 

⑧ メディアギャラリー

並び順も変えられます。

 

⑨ Epicデベロッパーコミュニティのフォーラム投稿

製品を紹介するため、製品はお使いの Epic Gamesアカウントからフォーラムに投稿されます。アカウントは Fab と Epicデベロッパーコミュニティの両方にリンクしている必要があります。
この投稿は、ディスカッションやサポートの問い合わせのための公開フォーラムとして機能します。出品のコメントからもアクセスできます。

好きなほうを選びましょう。

 

⑩ 成人向けコンテンツ

この出品には成人向けコンテンツが含まれていますか?

販売するアセットに合わせて調整します。

 

⑪ 生成 AI プログラムによる使用を許可しない

この製品に HTML の「AI なし」メタタグを割り当てて、生成 AI プログラムによる使用を禁止しますか?

任意です。

 

⑫ 生成人工知能 (AI) ツールの使用

この製品は、生成 AI ツールを使用して作成されていますか?

AI使用の可否です。

 

⑬ プロモーションコンテンツ

製品にプロモーションコンテンツが含まれる場合は、ボックスにチェックを入れてください。 ユーザーには、製品にプロモーションコンテンツが含まれていることが通知されます。 プロモーションコンテンツの例は、プロダクトプレースメント、ロゴ、スローガン、その他パブリッシャーのまたは他の誰かの現実世界のブランドを販売促進または宣伝するコンテンツです。

 

⑭ FAQ(よくある質問)

FAQ セクションを追加することで、製品に関して想定される質問への明確な回答を提供します。

顧客が迷いそうなものは、あらかじめ登録しておくと便利です。

ストアではここに表示されます。

 

コンテンツの追加

いよいよ、実際にデータを上げる作業です。

Fabの登録ページから「新規形式の追加」でUnrealEngineを選びます。

 

① プロジェクトバージョン

UEバージョンに合わせて、プラグインを登録していきます。

この作業は、プラグインが対応しているUEx.x ごとに1対1で作成します。

入力例

詳細は「⑥ 提出するファイルの種類について」を読んでください。

 

② 配信方法

本製品のファイルが、Epic Games Launchersからどのようにダウンロードされるかを設定します。

特に変更不要です。

 

③ サポートされている開発プラットフォーム

UEエディタの開発環境の指定です。

 

④ サードパーティソフトウェアの使用

製品が何らかのサードパーティソフトウェアを含む、使用する、依存する、配布するかどうかを宣言します。 サードパーティソフトウェアとは、パブリッシャーまたはEpic Games以外のソースからのフォント、グラフィック、サウンド、コンテンツ、ソースコード、コンパイルされたライブラリを含むがこれに限定されないあらゆるファイルを意味します。
この選択をすることにより、製品がいかなるサードパーティソフトウェアをも含まない、使用しない、依存しない、配布しないことを表明し、保証するものとします。以下のリンクから詳細を宣言する必要があります。

外部ライブラリやアセットが含まれる場合は注意しましょう。

 

⑤ 技術面の詳細

製品のUnreal Engineフォーマットの技術的側面を説明してください。

ストアページのここに表示されるものです。

技術的な内容を記載する場所です。例として、以下のような形式にするのがおすすめです。

・BPの数やC++クラスの数
・マルチプレイ対応かどうか
・ランタイムかエディタプラグインか?
・サポートプラットフォーム
・サポートビルド対象
・ローカライズなどあれば記載

 

⑥ 提出するファイルの種類について

UEプラグインを出品する場合、含められるファイルは種類によって変わります。

1. コードプラグインでない場合

・.uproject ファイル
・Content ディレクトリ
・Config ディレクトリ

 

2. Unreal Engine コードプラグインの場合

・.uplugin ファイル
・Source ディレクトリ
・Content ディレクトリ
・Config ディレクトリ

 

審査時に上記以外のフォルダが入っていると落とされたので注意が必要です。

・Intermediate
・Binaries
・Saved
・Build

 

ファイルサイズは、理想として15GB以下が良いです。

15GBを超える場合はサポートの審査が入るので、気を付けましょう。

dev.epicgames.com引用:Unreal Engine プロジェクト形式

 

3. 例外:プラグインの翻訳データを含めたいケース

コードプラグインに翻訳向けのローカライズを含める場合、どうしてもContentフォルダ内に.poデータが必要なケースがあります。

この場合、コードプラグインであっても、アップロード時の備考に記載することでContentフォルダ込みでリリースできました。

バージョン注記で記載した文章 ↓

pass: -----------------
Verified on UE 5.3-5.7 (Win64)Re prior review: No .uasset content; only UE localization data. Content/Localization/<Target>/ path is hardcoded by UE engine. Requesting Epic approval per exception clause.

実際のデータは以下のようになります。

 

⑦ .uplugin設定

.uplugin設定には、Fabに上げるためのいくつかの注意点があります。

 

1. EngineVersion とサポートエンジンバージョンを合わせる

プラグイン名.upluginEngineVersionが一致していないとはじかれるので、気を付けましょう。

"EngineVersion": "5.3.0",

 

2. MarketplaceURL を必ず記載する

マーケットプレイスURLを記述する必要があります。Fabの出品ページのURLになります。

"MarketplaceURL": "https://www.fab.com/listings/ここに製品ID",

製品IDは、出品画面のWebURLに含まれています。

例:https://www.fab.com/portal/listings/ここにあなたの製品ID/edit

 

3. SupportURL を記載する

このプラグインや製品のサポートにつながるURLを記載しましょう。

ここではDiscordの招待リンクを貼りました。

"SupportURL": "ーーー",

 

4. DocsURL(ドキュメントURL)を記載する

このプラグインや製品のドキュメントURLを記載しましょう。

 

5. CreatedByURL を記載する

ここはFabのセラープロフィールでOKです。

 

⑧ 提出するファイルについて(アップロード)

これらの作業を終えたら、完成したプラグインをzipファイルに圧縮します。

このとき、審査のために一時的にファイルを公開する必要があるので、心配であればzipにパスワードをかけておくのがおすすめです。

有名どころだと7-Zipが使いやすくおすすめです。

7-zip.opensource.jp

完成したzipは、Google Driveなど一時的に共有できる場所にアップロードします。

Google Driveであれば以下のように
共有設定を「リンクを知っている全員」に変更し、リンクを控えます。

控えたリンクをプロジェクトファイルのリンク欄に貼り、バージョン注記にzipのパスワードを記載しておきましょう。

 

⑨ 審査と提出

すべての入力が終わったら、右上から「出品プレビュー」を行いましょう。

問題なければ「レビューのために提出する」を押して、審査を待ちます。

提出時に、審査通過後に自動公開するか/手動で公開するかを選べます。

結果は1〜2営業日で来ます。

審査結果はメールで fab-support@epicgames.com から届きます。

問題がある場合は、各項目のレビューをまとめたpdfが届くので、それに従って再挑戦しましょう。

審査が通るとメールが届き、ストアで確認できます。

 

⑩ 技術審査チェックリスト(日本語訳)

最後に、審査項目の日本語訳をまとめておきます。

引用:FAB Support

 

1. 製品リスティング(Product Listing)

全般

・すべてのテキストは正確で、アセットに関連している必要がある
・すべてのテキスト項目に英語版が含まれている必要がある

メディア

・メディアはプロジェクトの該当機能・内容を正確に表示している必要がある

技術情報(Technical Information)

・すべての技術情報項目が完全に記入されている必要がある
・技術情報のテキストは、アセット使用に必要な依存関係(あれば)・前提条件・その他の要件を明示している必要がある

プロジェクトファイル(Project Files)

・各プロジェクトファイルリンクには、適切なフォルダ構造を持つUEプロジェクトまたはプラグインフォルダが1つだけホストされている必要がある
・提供されるプロジェクトが、記載されている対応エンジンバージョンと一致している必要がある
・配布方法が、製品の内容・機能に対して適切である必要がある

 

2. コンテンツ(Content)

ファイル

・Contentフォルダには、プロジェクト名を冠した単一のPackフォルダが含まれている必要がある(Epicの別途承認がある場合を除く)
・Packフォルダ内の第1階層フォルダは、アセットタイプまたは特定アセット名で命名されている必要がある
・すべてのアセットタイプがそれぞれのフォルダ内に格納されている必要がある
・プロジェクトに未使用のフォルダ・アセットが含まれていないこと
・アセットのファイルパスが170文字未満であること
・すべてのリダイレクタがクリーンアップされていること
・命名規則が英語・英数字で、プロジェクト全体で一貫しており、アセットの内容を正確に表している必要がある
・.uprojectで未使用のプラグインが無効化されていること

ドキュメント

・必要に応じて、パブリッシャーがリンク版またはエディタ内のドキュメント/チュートリアルを提供していること
・すべてのアセットが完成しており、意図どおりに機能すること

法務(Legal)

・製品は、いかなる個人・団体・組織・製品に対しても不快・下品・中傷的であってはならず、Epic Games・Unreal・Fabを貶めるものであってはならない
・Megascansコンテンツは再配布できない
・Epic Gamesのサンプルコンテンツやソースコードの相当部分は、表示・例示目的のみで使用されている

 

3. コードプラグイン(Code Plugins)
・.upluginに、プラグインのインストール対象となるメジャーエンジンバージョンを値とする「EngineVersion」キーがある
・.upluginの全モジュールに、対応ターゲットプラットフォームと一致する「PlatformAllowList」/「PlatformDenyList」キーがある
・すべてのソース・ヘッダファイルに、パブリッシャー名と発行年を記したコメント付き著作権表示が含まれている
・プラグインフォルダを起点とするすべてのファイルパスが170文字以下であること
・プラグインがエラーや重大な警告を発生させないこと
・プラグインフォルダに未使用・ローカルフォルダ(Binaries、Build、Intermediate、Saved等)が含まれていないこと
・FilterPlugin.iniで、パブリッシャーが配布を意図するカスタムフォルダ(Docs等)をフィルタしていること
・C++のサードパーティコード・ライブラリはSourceフォルダ内のThirdPartyフォルダに配置すること。Pythonのサードパーティコード・ライブラリはContent/Python/Lib/site-packages/配下に配置すること
・サードパーティコードを使用するプラグインでは、サードパーティソフトウェアフォームが正確に記入されていること
・Unreal Engineソースコードに依存するすべてのコードは、人間が読めるソース形式でプラグインフォルダに含めること。UEソースコード依存を含まない、外部でコンパイルされた静的ライブラリやDLLは含めてもよいが、審査対象となる

 

最後に

 

本記事に書くにあたり公開したプラグインはこちらです。

www.fab.com
UEのエディタから開いたアセット履歴を専用のタブから管理できるツールになっています。良ければ見てみて下さい。




UE4やUE5向けの記事を書いています。

皆様の応援が投稿のモチベーションになりますので

コメントやX(Twitter)のフォローなどしていただけるとありがたいです。

それではよきゲーム開発を。

投げ銭を投げる

 

【UE6α・Verse】〈Tips〉画面上にデバッグログを出す方法 (Print / Log)

目次

 

はじめに

 

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の内容が表示できます。

Log LogVerse Verbose

 

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

 

デフォルトの表示に戻すときは

 Log LogVerse Default

 

末尾の 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)のフォローなどしていただけるとありがたいです。

それではよきゲーム開発を。

投げ銭を投げる

 

【UE6α・Verse入門】〈Tips〉UE6のVerseでプレハブ間の関数を実行しよう

目次

 

はじめに

UE6mainのブランチが公開されて、だれでもUE6のVerseに触ることができるようになりました。

今回はその第一弾として異なるプレハブのVerse同士で関数を呼ぶ方法について解説してみます。

※UE6mainは2026/06/24現在の情報です。

αですらない開発中のものなので大きく仕様変更される可能性が非常に高いです。
あくまで参考程度に閲覧時点での最新情報をご参照ください。

 

個人の備忘録としてまとめています。誤った情報がある場合があります。

コメントにてご指摘のほどお願いいたします。

 

前提として
①UE6のエンジンビルドが済んでいること。

②Verseの実行環境が整っていることが必要です。


EpicのGithubアクセス権があればエンジンをこちらから落としてください。

https://github.com/EpicGames/UnrealEngine/tree/ue6-main

 

こちらを参考に手元の環境でエンジンビルドをしてください。
(~100GBくらいの容量の余裕があったほうがいいです)

dev.epicgames.com


そのままだと(記事公開時点では)Verseプロジェクトが作れないので、
こちらを完遂してVerseが書けるようになり実行できるようにしてください。
https://ronaldburns.dev/projects/how-to-verse-in-ue6/

 

解説

⓪ 見た目用のメッシュを用意

Verseからメッシュアセットにアクセスできるようにエンジンコンテンツから自作のGameFeaturePlugin側にメッシュを持ってきておきます。

 

今回は以下の2つ
/Engine/BasicShapes/Cone
/Engine/BasicShapes/Cube

 

こちらを自作のGameFeaturePluginにコピーしました。



① Verse - ファイルの作成

VerseExplorerの自作プラグインから2つVerseコンポーネントを追加します。


右クリック->CreateVerseFileから


それぞれSceneGraphComponentを選びます。

 

それぞれ以下のように名前を付けました。

receive_nofity_component「通知を受け取る側」のコンポーネント。

sent_notify_component 「通知を送る側」のコンポーネント。

② Verse - 受け取り処理

receive_nofity_componentをVSCodeで開きます。
ここには外部から実行してもらうための受け取り用の関数を1つ作ります。

関数名はNotify

文字列Messageを受け取って画面にPrintするシンプルな関数です。

    Notify<public>(Message:string):void =
        # ?Color : 画面表示テキストの色(NamedColors から選ぶ)。受信成功は緑にする。
        # ?Duration : 画面に表示する秒数(デフォルト2秒)。
        Print("receive_nofity_component received: {Message}",
        ?Color := NamedColors.Green, ?Duration := 5.0)

 

全文 ▼

using { /Verse.org }            # Print など基本機能
using { /Verse.org/Native }     # ネイティブ連携
using { /Verse.org/SceneGraph } # component / entity など SceneGraph の中核
using { /Verse.org/Simulation } # シミュレーション(ゲーム実行)関連
using { /Verse.org/Colors }     # NamedColors(Print の色指定)に必要

# ============================================================================
# receive_nofity_component : 「通知を受け取る側」のコンポーネント。
# ============================================================================
receive_nofity_component<public> := class<final_super>(component):

    # ------------------------------------------------------------------------
    # Notify : 外部(sent_notify_component)から呼ばれる「公開の入口」となる関数。
    #
    #   ・Notify(Message:string):void の読み方
    #       Notify        … 関数名
    #       (Message:string) … 引数。Message という名前の string(文字列)を1つ受け取る
    #       :void         … 戻り値の型。void は「何も返さない」という意味
    #   ・<public> を付けないと別ファイルから呼べないので、入口となる関数には必須。
    #   ・「=」の後ろが関数の中身(本体)。
    # ------------------------------------------------------------------------
    Notify<public>(Message:string):void =
        # ?Color : 画面表示テキストの色(NamedColors から選ぶ)。受信成功は緑にする。
        # ?Duration : 画面に表示する秒数(デフォルト2秒)。
        Print("receive_nofity_component received: {Message}",
        ?Color := NamedColors.Green, ?Duration := 5.0)

 

③ Verse - 送信処理

sent_notify_componentをVSCodeで開きます。

ここはエディタで指定したターゲットに対して通知を送る側のコンポーネントです。

エディタにターゲットとメッセージの内容を指定するために2つの変数を用意します。


1.TargetEntity - プレハブへの参照をさせるため


エディタの参照ピッカーが選ぶ対象はentityのためここはentity型を指定します。

    @editable
    var TargetEntity<public>:?entity = false


ちなみに

receive_nofity_component = false と型を変えた場合、

エディタ側に「コンポーネントを選ぶピッカー」が出せない

(=割り当て手段がない)ため、この用途では成立しません。


実際にやってみたところ、エディタには「型」のピッカーが出て、

割り当てると送信側エンティティ内に新インスタンスが生成された(InitializeComponentField の挙動)。

別プレハブは参照されず、自前の新コンポーネントの Notify が緑ログを出す。
という挙動になるようです。

2.MessageToSend - メッセージ内容

receive側に送る文字列です。

    @editable
    var MessageToSend<public>:string = "Hello from sent_notify_component"


こちらも @editableを付けることでエディタに公開しています。

3.NotifyReceiver- メッセージ送信関数

TargetEntity から receive_nofity_component を取り出してその Notify を呼ぶ本体です。

 

TargetEntityが空だったり、receive_nofity_componentを持っていない場合失敗となり、
持っている場合はreceive_nofity_componentのNotifyをMessageToSendを引数として呼び出します。

NotifyReceiver():void =
        if:
            Target := TargetEntity?
            ReceiveComp := Target.GetComponent[receive_nofity_component]
        then:
            ReceiveComp.Notify(MessageToSend)
        else:
            Print("sent_notify_component: TargetEntity has no receive_nofity_component",
            ?Color := NamedColors.Red, ?Duration := 5.0)



全文 ▼

using { /Verse.org }            # Print など基本機能
using { /Verse.org/Native }     # ネイティブ連携
using { /Verse.org/SceneGraph } # component / entity など SceneGraph の中核
using { /Verse.org/Simulation } # シミュレーション(ゲーム実行)関連
using { /Verse.org/Colors }     # NamedColors(Print の色指定)に必要

# ============================================================================
# sent_notify_component : 「通知を送る側」のコンポーネント。
# ============================================================================
sent_notify_component<public> := class<final_super>(component):

    # ------------------------------------------------------------------------
    # TargetEntity : 通知先のプレハブ(receive側を持つエンティティ)への参照。
    #
    #   ・@editable
    #       この変数をUnrealエディタのDetailsパネルに表示する指定。
    #       実行前にエディタ上で「receive側プレハブ」をここにドラッグ割り当てする。
    #   ・var
    #       「変数(あとで値を入れ替えられる)」の宣言キーワード。
    #       var を付けないと定数(再代入不可)になる。
    #   ・?entity (型の前の「?」)
    #       option(オプション)型。「entity が入っているかもしれないし、空かもしれない」。
    #       未割り当てでもエラーにならず安全に扱えるようにするための型。
    #   ・= false
    #       option 型の「中身が空」を表す初期値。false は「未設定」の意味。
    #       (エディタで割り当てれば、実行時には中身ありの状態になる)
    # ------------------------------------------------------------------------
    @editable
    var TargetEntity<public>:?entity = false

    # ------------------------------------------------------------------------
    # MessageToSend : receive側に送る文字列。エディタで編集できるようにする。
    #
    #   ・関数 Notify の「引数」はコードで渡す値であり、そのままではエディタに出ない。
    #     エディタで指定したい値は、このように @editable 変数として持っておき、
    #     呼び出し時にその変数を引数として渡す、という形にする。
    #   ・型は string(文字列)。初期値を入れておくと未編集でもその文字列が送られる。
    #   (数値も送りたい場合は「@editable var SendValue:int = 0」のように増やし、
    #     Notify 側の引数も増やして Notify(MessageToSend, SendValue) のように渡す)
    # ------------------------------------------------------------------------
    @editable
    var MessageToSend<public>:string = "Hello from sent_notify_component"

    # ------------------------------------------------------------------------
    # OnBeginSimulation : このコンポーネントがゲーム内で動き始めるときに
    #                     エンジンが自動で呼び出すライフサイクル関数。
    #
    #   ・<override> … 親クラス component が持つ同名関数を「上書き」して中身を差し替える指定。
    #   ・(super:)OnBeginSimulation()
    #       super は「親クラス」を指す。先に親側の初期化処理を実行してから、
    #       自分の処理を書くのがお約束。これを忘れると親の準備が漏れることがある。
    # ------------------------------------------------------------------------
    OnBeginSimulation<override>():void =
        (super:)OnBeginSimulation()  # まず親の処理を実行
        NotifyReceiver()             # その後、自作の通知処理を呼ぶ

    # ------------------------------------------------------------------------
    # NotifyReceiver : TargetEntity から receive_nofity_component を取り出して
    #                  その Notify を呼ぶ、このクラスの中心となる処理。
    #
    #   if / then / else の使い方がポイント。
    #   Verse では「失敗するかもしれない式」を if の条件に並べて書ける。
    #   条件の式が全部成功したら then、どこか1つでも失敗したら else に進む。
    # ------------------------------------------------------------------------
    NotifyReceiver():void =
        if:
            # (1) TargetEntity? … option から中身を取り出す。
            #     中身が空(未割り当て)なら、ここで「失敗」して else に飛ぶ。
            #     成功したら、取り出した entity を Target に入れる。
            Target := TargetEntity?

            # (2) Target.GetComponent[receive_nofity_component]
            #     エンティティ Target が持つコンポーネントの中から
            #     receive_nofity_component 型のものを取得する。
            #     ・角括弧 [ ] は「失敗するかもしれない呼び出し」を表す記法。
            #       目的の型のコンポーネントが無ければ失敗して else に飛ぶ。
            #     成功したら、取得したコンポーネントを ReceiveComp に入れる。
            ReceiveComp := Target.GetComponent[receive_nofity_component]
        then:
            # (1)(2) が両方成功したときだけここに来る。
            # 取得した receive 側コンポーネントの公開関数 Notify を呼び出す。
            # 引数には、エディタで編集できる @editable 変数 MessageToSend を渡す。
            ReceiveComp.Notify(MessageToSend)
        else:
            # 参照が未割り当て、または相手が receive_nofity_component を
            # 持っていない場合のフォールバック(保険)処理。
            # 失敗(未割り当て等)の警告なので赤で表示する。
            Print("sent_notify_component: TargetEntity has no receive_nofity_component",
            ?Color := NamedColors.Red, ?Duration := 5.0)


すべて書けたらCompile Verseを忘れずに

④ プレハブの作成 

いよいよ本番です。
送受信それぞれにVerseComponentをもつプレハブを作りましょう。
ここはUnityっぽいですね。

プラグインフォルダ内でコンテンツブラウザから右クリック=>EntityPrefabを選びます。

 

New prefabを押します。



名前はEntityPrefabの頭文字をとってEP_としました。

EP_Receiver - 受信用のプレハブ
EP_Transmitter - 送信用のプレハブ


プレハブの編集 EP_Receiver 

エディタが開いたらDetailsの+componentから見た目を追加してきましょう。
Cubeを選びました。

もしくはコンテンツブラウザからドラッグ&ドロップでも行けます。

(プラグインフォルダのアセットなら)

上手くできない場合は再度Verseコンパイルしておきましょう。

VerseコンパイルすることでMeshアセットが参照される。

 

receive_nofity_componentも追加して以下のようになればOK



プレハブの編集 EP_Transmitter


同じようにDetailsの+componentから見た目を追加してきましょう。
こちらはConeを選びました。

もしくはコンテンツブラウザからドラッグ&ドロップで。


sent_notify_componentを追加してこのようになったらOK

 

⑤ レベルの作成

実際に作ったものを配置するレベルを作成します。

File->NewLevelから

 

Basicにしました。

 

プラグインフォルダ内L_NotifySampleとして保存しました。

 

⑥ プレハブの配置

そうしたら、それぞれのプレハブを1つづつレベルに配置します。

 

⑦ トランスミッターの送信先指定

EP_Transmitterを選択します。
Outlinerに出ないのは、バグですかね。?
とにかくConeを押すとDetailsが表示されます。
sent_notify_componentを選択すると、、

 

Verse上で公開した変数が表示されます。

 

TargetEntityを指定する前に、どのEntityに向けて送信するかを確認しておきましょう。

EP_Receiverを選択して後ろのidを控えます。1225938....でした。

 

TargetEntityでReceiverプレハブを指定します。

 

素敵なメッセージを入れて準備完了。

 

実行ボタンを押してチェックしましょう。

 

はい。こんちゃっす。

 

 

最後に


UE4やUE5向けの記事を書いています。

皆様の応援が投稿のモチベーションになりますので

コメントやX(Twitter)のフォローなどしていただけるとありがたいです。

それではよきゲーム開発を。

投げ銭を投げる

 

【UE5】〈Tips〉UE5.8 C++環境構築セットアップ(Windows)

目次

メモ

⓪ビルドエラーについて

UE5.7までうまくいっていた環境でUE5.8を実行したときに以下のエラーで失敗したためMSVCの更新と一緒に具体的な手順をこちらで解説します。


Using Unreal Build Accelerator local executor to run 47 action(s)  CPU 12 physical cores, 24 logical cores  Memory 95.93 GB physical, 41.07 GB/101.93 GB committed  UBA Storage capacity 40 GB[1/47] Compile [x64] SharedPCH.UnrealEd.Project.ValApi.ValExpApi.Cpp20.cpp0>ContainerAllocationPolicies.h(843,3): Error C7539 : 'ForAnyElementType': ユーザー宣言コンストラクターを持つクラスには、クラスと同じ名前のメンバーを含めることはできません using SuperClass::ForAnyElementType::ForAnyElementType; ^C:\Program Files\Epic Games\UE_5.8\Engine\Source\Runtime\Core\Public\Containers\ContainerAllocationPolicies.h(843,3): note: テンプレートインスタンス化コンテキスト (最初に最も古いもの) はC:\Program Files\Epic Games\UE_5.8\Engine\Source\Runtime\Core\Public\Containers\ContainerAllocationPolicies.h(918,2): note: コンパイル対象の クラス テンプレート インスタンス化 'TSizedHeapAllocator<IndexSize,BaseMallocType>' のリファレンスを確認してください}; ^C:\Program Files\Epic Games\UE_5.8\Engine\Source\Runtime\Core\Public\Containers\ContainerAllocationPolicies.h(898,1): note: コンパイル対象の クラス テンプレート インスタンス化 'TSizedHeapAllocator<IndexSize,BaseMallocType>::ForAnyElementType' のリファレンスを確認してください BaseMalloc::Free(InData);^Total time in Unreal Build Accelerator local executor: 31.83 seconds

Result: Failed (OtherCompilationError)Total execution time: 33.95 secondsTrace written to file C:\Users\-\AppData\Local\UnrealBuildTool\Trace.uba with size 8.9kb0>Microsoft.MakeFile.Targets(44,5): Error MSB3073 : コマンド ""C:\Program Files\Epic Games\UE_5.8\Engine\Build\BatchFiles\Build.bat" UE58CPlusEditor Win64 Development -Project="D:\UE5Projects\UE58CPlus\UE58CPlus.uproject" -WaitMutex -FromMsBuild -architecture=x64" はコード 6 で終了しました。

①Visual Studio 2022 17.14をいれる

https://learn.microsoft.com/ja-jp/visualstudio/releases/2022/release-history

最新のものを入れた。17.14.35



ダウンロードされたexeを叩くと、インストーラーが表示される。

この時にMSVC v143 - VS 2022 C++ x64/x86 ビルドツール (最新)にチェックが入っているのを確認すること。

ワークロードから画像の内容にチェックを入れてダウンロード&インストール
(27GBくらい)

 

チェックを入れるコンポーネントを具体的に知りたい場合は公式のページを参照

dev.epicgames.com

 

②BuildConfiguration.xmlを更新する

C:\Users\ユーザー名\AppData\Roaming\Unreal Engine\UnrealBuildTool

ここにあるBuildConfiguration.xmlをエディタで編集する。

MSVCを誤ったバージョンを参照しないように、MSVC 14.44.35207を明示的に指定しておく。

<?xml version="1.0" encoding="utf-8" ?>
  <WindowsPlatform>
    <CompilerVersion>14.44.35207</CompilerVersion>
  </WindowsPlatform>
</Configuration>

 



ブロジェクトファイルをビルドして通ることを確認して完了。

おつかれさまでした。

 

 

最後に

UE4やUE5向けの記事を書いています。

皆様の応援が投稿のモチベーションになりますので

コメントやX(Twitter)のフォローなどしていただけるとありがたいです。

それではよきゲーム開発を。

投げ銭を投げる

 

【椅子】オカムラ シルフィーのアームレストの取り外し方

目次

 

はじめに

この記事では、シルフィーにアームレストがついている状態で購入して、

 

アームレストを外したいケースでの対処方法について解説します。

 

背景として、ギターやハンコンでのゲームなどアームレストが邪魔になるケースがあったためです。

 

適切な道具を使うことで非破壊的に着脱できますが、公式サポートが受けられなくなるリスクや故障・安全上の問題になる可能性がありますので、自己責任の上で行ってください。

 



メモ

椅子を裏返します。

 

アームレストは六角穴付ボルト2本で止まっています。

 

かなりのトルクが必要なので長めのL型六角レンチで外していきます。

 

 

六角穴付ボルトはM6規格ですので、使用したレンチは5mmのものを使います。

 

手元にない場合はこれらを購入しておくと便利です。

amzn.to

amzn.to

 

ねじ止め剤が塗布されており、なかなか硬かったですが取り外せました。

 

 

再度取り付ける場合も同じようにボルト2本で組付けましょう。

 

ネジはなくさないように保管しましょう。

 

 

最後に

UE4やUE5向けの記事を書いています。

皆様の応援が投稿のモチベーションになりますので

コメントやX(Twitter)のフォローなどしていただけるとありがたいです。

それではよきゲーム開発を。

投げ銭を投げる

 

【UE5】〈Tips〉時間同士の足し算、引き算

目次

 

はじめに

UEで「現在時刻に60秒を足したい」と思ったとき、どの型を使えばいいか迷ったことはありませんか?

UEには時間を扱う構造体として FDateTime と FTimespan が用意されています。

どちらも内部的には int64 のTick値を保持していますが、意味が全く異なります。

 

この記事では、これらの型の演算子を網羅的に検証し、どの組み合わせが有効で、どれがベストなのかを明らかにします。

 

個人の備忘録としてまとめています。誤った情報がある場合があります。

もっと良い方法などもあるかもしれません!
コメントにてご指摘のほどお願いいたします。

 

UE5.6で解説します。

 

解説

①時間を表す構造体

FDateTime — 「時刻」を表す型

FDateTime は 特定の一点の時刻(いつ)を表します。

// 現在のUTC時刻を取得
FDateTime UtcNow = FDateTime::UtcNow();

// 現在のローカル時刻を取得
FDateTime LocalNow = FDateTime::Now();

// 特定の日時を指定して生成
FDateTime SpecificDate(2026, 3, 23, 15, 0, 0, 0); // 2026323 15:00:00.00
FTimespan — 「時間の長さ」を表す型

FTimespan は 時間の長さ(どれだけ)を表します。特定の日付に紐づかない「期間」です。

// ファクトリメソッドで生成
FTimespan OneMinute = FTimespan::FromSeconds(60.0);
FTimespan ThreeHours = FTimespan::FromHours(3.0);
FTimespan HalfDay = FTimespan::FromDays(0.5);

// コンストラクタで生成(時, , 秒)
FTimespan Duration(2, 30, 0); // 2時間300

// 値の取得
double TotalSec = OneMinute.GetTotalSeconds(); // 60.0
double TotalMin = OneMinute.GetTotalMinutes(); // 1.0

 

Blueprint での注意点

C++ の FromDays 等は float / double を受け取るため 0.5(半日)のような小数値を渡せます。

しかし、Blueprint の Make Timespan ノードは全引数が int32 のため、小数値を直接指定できません。

半日を表現したい場合は Days=0, Hours=12 のように分解するか、From Days ノードを使ってください。

 

Make Timespan と Make Timespan2 の違い

Make Timespan と Make Timespan2 の違いは最後の引数だけです。

Make Timespan はミリ秒(Milliseconds)、Make Timespan2 はナノ秒の端数(FractionNano)で精度を指定します。

 

②演算子の検証

FDateTime - FDateTime = FTimespan

2つの時刻の差を求めると、経過時間(FTimespan) が得られます。

FDateTime Start(2026, 3, 23, 10, 0, 0);
FDateTime End(2026, 3, 23, 13, 30, 0);

FTimespan Elapsed = End - Start;

UE_LOG(LogTemp, Log, TEXT("経過時間: %.1f "), Elapsed.GetTotalSeconds());
// 経過時間: 12600.0

UE_LOG(LogTemp, Log, TEXT("経過時間: %.1f 時間"), Elapsed.GetTotalHours());
// 経過時間: 3.5 時間

「15:00 から 12:00 を引くと?」→ 答えは「3時間」という長さになります。直感通りですね。

FDateTime + FTimespan = FDateTime

時刻に時間の長さを足すと、新しい時刻 が得られます。

FDateTime Now = FDateTime::UtcNow();
FTimespan OneHour = FTimespan::FromHours(1.0);

FDateTime OneHourLater = Now + OneHour;

UE_LOG(LogTemp, Log, TEXT("現在: %s"), *Now.ToString());
UE_LOG(LogTemp, Log, TEXT("1時間後: %s"), *OneHourLater.ToString());

「今日の15:00」+「1時間」=「今日の16:00」。これも自然です。

 

FDateTime - FTimespan = FDateTime

時刻から時間の長さを引くことも可能です。

FDateTime Now = FDateTime::UtcNow();
FTimespan ThirtyMinutes = FTimespan::FromMinutes(30.0);

FDateTime ThirtyMinutesAgo = Now - ThirtyMinutes;

UE_LOG(LogTemp, Log, TEXT("30分前: %s"), *ThirtyMinutesAgo.ToString());

 

FDateTime + FDateTime = コンパイルエラー

FDateTime A(2026, 3, 23, 10, 0, 0);
FDateTime B(2026, 3, 23, 15, 0, 0);

FDateTime Result = A + B; // コンパイルエラー!
// error: binary 'operator+': no operator found

「3月23日 10:00」+「3月23日 15:00」= ???

これは意味のない演算です。
地理に例えるなら「東京 + 大阪 = ???」のようなもの。2つの絶対位置を足し算することに意味はありません。

一方、引き算は「東京から大阪までの距離」のように相対的な差を求めるので意味があります。

内部的には FDateTime も FTimespan も同じ int64 のTick値を持っているため、Epicが operator+ を実装すること自体は簡単です。しかし、あえて提供していません。

これは型システムによって意味のない操作をコンパイル時に防ぐという、意図的な設計判断のように見えます。

 

Blueprint での注意点

C++ では FDateTime + FDateTime はコンパイルエラーになりますが、

Blueprint の + ノードではコンパイルが通ってしまいます。

内部のTick値がそのまま加算されるため、結果は意味のない日時になります。

 

例: 2026/3/23 13:30 + 2026/3/23 10:00 → 4051/6/12 23:30(ゴミ値)

Blueprint では型チェックが緩いため、C++ のような保護が働きません。

FDateTime 同士の加算は意味がないので、Blueprint でも使わないようにしましょう。



FTimespan 同士の演算

時間の長さ同士は自由に演算できます。

FTimespan A = FTimespan::FromHours(2.0);
FTimespan B = FTimespan::FromMinutes(30.0);

FTimespan Sum = A + B; // 2時間30
FTimespan Diff = A - B; // 1時間30
FTimespan Doubled = A * 2.0; // 4時間
FTimespan Halved = A / 2.0; // 1時間

UE_LOG(LogTemp, Log, TEXT("合計: %.1f "), Sum.GetTotalMinutes()); // 150.0
UE_LOG(LogTemp, Log, TEXT("差分: %.1f "), Diff.GetTotalMinutes()); // 90.0
UE_LOG(LogTemp, Log, TEXT("2: %.1f 時間"), Doubled.GetTotalHours()); // 4.0
UE_LOG(LogTemp, Log, TEXT("半分: %.1f 時間"), Halved.GetTotalHours()); // 1.0

「2時間 + 30分 = 2時間30分」。長さ同士の足し算は自然ですね。

 

最後に


UE4やUE5向けの記事を書いています。

皆様の応援が投稿のモチベーションになりますので

コメントやX(Twitter)のフォローなどしていただけるとありがたいです。

それではよきゲーム開発を。

投げ銭を投げる

 

【Claude Code】VSCodeでopenLast not foundで開かないバグの対処法

 

メモ

Claude Code for VS Code において、

以下の不具合でウィンドウが出なくなる問題に当たった。

command 'claude-vscode.editor.openLast' not found

 

試したこと

VSCode再起動->効果なし

PC再起動->効果なし

 

Claude Code for VS Code バージョン2.1.53



 

同様の問題がRedditでも報告されていた。
最新のものに問題があり、ダウングレードが良いみたい。

https://www.reddit.com/r/ClaudeAI/comments/1rd9kl1/fix_for_command_claudevscodeeditoropenlast_not/

 

(引用:

https://www.reddit.com/r/ClaudeAI/comments/1rd9kl1/fix_for_command_claudevscodeeditoropenlast_not/)

  1. VS Code の拡張機能タブに移動します。

  2. Claude Code を 見つけて、歯車アイコン ⚙️ をクリックします。

  3. 「別のバージョンをインストール...」 をクリックします。

  4. ドロップダウンリストから 2.1.49 を選択します。

  5. VS Code をリロードします。

 

①拡張機能からClaude Code for VS Codeをひらく


②歯車アイコン->特定のバージョンのVSIXをダウンロード

 

③2.1.49 を選択

 

④自身のPCのプラットフォームを選択。


(自分の場合はWindows 64bit を選んだ)

 

⑤VSIXのダウンロード

 

⑥自動更新のチェックを外しておく

 

⑦ダウンロードしたVSIXをVSCodeの拡張機能にドラッグ&ドロップしてインストール


⑧拡張機能の再起動

 

なおりました。履歴も生きています。

 

最後に

既にイシューとして挙がっているので、修正は早いかもしれません。

github.com

 

UE4やUE5向けの記事を書いています。

皆様の応援が投稿のモチベーションになりますので

コメントやX(Twitter)のフォローなどしていただけるとありがたいです。

それではよきゲーム開発を。

投げ銭を投げる