ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
Unreal Engine 5(UE5)のFrameGrabberは、レンダリング結果(描画フレーム)をキャプチャするためのC++向けの仕組みであり、ブループリント(Blueprint)から直接呼び出せる標準ノードは用意されていません。そのため「ブループリントだけで画面フレームを取得したい」場合は、FrameGrabber自体を使うのではなく、Scene Capture 2D+Render Target、ハイレゾスクリーンショット用のコンソールコマンド、あるいはFrameGrabberをC++でラップしてBPノードとして公開する、のいずれかを選ぶのが現実的です。この記事では、それぞれの違いと、ブループリント中心で画面を取得する具体的な手順を解説します。
| この記事の要点 |
|---|
|
FrameGrabberとは
FrameGrabberは、ビューポートに描画されたレンダーターゲット(フレームバッファ)の内容を、効率よくCPU側へ取り出すための仕組みです。実体はC++のFFrameGrabberクラスで、エンジンのMovieSceneCaptureモジュールに含まれています。内部的には複数の解像度サーフェスを使い回し、レンダースレッド側で描画結果を解決(resolve)してから取得するため、毎フレームのキャプチャでも描画を待たせにくい設計になっています。
主なメソッドは次のとおりです(いずれもC++から呼び出します)。
// FFrameGrabber の主なメソッド(C++、MovieSceneCapture モジュール) StartCapturingFrames(); // キャプチャ開始 CaptureThisFrame(Payload); // このフレームをキャプチャ対象としてキューに積む GetCapturedFrames(); // 取得済みフレームを受け取る(FCapturedFrameData の配列) StopCapturingFrames(); // キャプチャ停止 |
このように、FrameGrabberは本来C++のAPIです。レベルシーケンスの動画書き出し(Movie Render)など、エンジン内部のキャプチャ処理でも利用されています。ブループリント側に「FrameGrabber」という名前のノードが標準で見当たらないのはこのためで、BPから使うには後述のとおり何らかの橋渡しが必要になります。
ブループリントから画面を取得する現実的な手段
「ブループリントから画面フレームを取得したい」という目的に対しては、FrameGrabberに固執するよりも、次の3つの選択肢から用途に合うものを選ぶのが実用的です。
- Scene Capture 2D+Render Target: カメラ視点をRender Target(
UTextureRenderTarget2D)へ描画し、その内容をテクスチャやファイルとして取り出す。BPノードだけで完結しやすい。 - ハイレゾスクリーンショット系コンソールコマンド:
HighResShotなどをExecute Console Commandで実行し、実際に表示されている最終画面をPNGとして保存する。最も手軽。 - FrameGrabberをC++でラップしてBPへ公開:
FFrameGrabberを使うアクターやサブシステムをC++で実装し、開始・取得・停止をUFUNCTION(BlueprintCallable)でノード化する。低レイテンシ・連続フレーム取得が必要な場合向け。
各手段の比較
それぞれ、得意な用途・実装コスト・取得できる対象が異なります。下表を目安に選んでください。
| 手段 | 取得対象 | BPだけで可能か | 主な用途 | 実装コスト |
|---|---|---|---|---|
| Scene Capture 2D+Render Target | 指定カメラ視点のシーン(最終UIは含まない) | 可能 | ミニマップ・鏡・監視カメラ・サムネイル | 低〜中 |
ハイレゾスクリーンショット(HighResShot) |
実際に表示されている最終画面 | 可能(コマンド実行のみ) | スクリーンショット保存 | 低 |
| FrameGrabber(C++でラップ) | ビューポートの描画フレーム(連続取得) | 不可(C++が必要) | 動画化・外部転送・毎フレーム処理 | 高 |
ポイントは「最終的に画面に出ているUI込みの絵」が欲しいのか、「3Dシーンの絵」が欲しいのかです。HUDやUMG(ウィジェット)まで含めたい場合はスクリーンショット系が確実で、Scene Capture 2Dは原則として3Dシーンの描画が対象になります。
Scene Capture 2Dでの画面取得手順
ブループリント中心で進めるなら、まずはScene Capture 2Dを使う方法が扱いやすいです。考え方は「カメラ(Scene Capture 2D)が映した映像をRender Targetという受け皿に描き込み、それを参照する」というものです。
大まかな流れは次のとおりです。
- コンテンツブラウザでRender Target(
Texture Render Target 2D)アセットを作成し、解像度(例: 1920×1080)を設定する。 - レベルにScene Capture 2Dアクターを配置するか、アクターのコンポーネントとしてScene Capture Component 2Dを追加する。
- そのコンポーネントのTexture Targetに、作成したRender Targetを割り当てる。
- キャプチャしたい視点にScene Capture 2Dを向ける(プレイヤーカメラと同じ位置・回転に追従させると、画面に近い絵が得られる)。
- Render Targetの内容を、マテリアルで表示する/テクスチャ化する/ファイルへ書き出す、のいずれかで利用する。
取得した絵をテクスチャとして再利用したい場合、ブループリントのDraw Material to Render TargetなどでRender Targetへ描画したうえで、コンテンツブラウザ上でRender Targetを右クリックし「Create Static Texture」から静的テクスチャ化する、という手順が使えます。ランタイムでファイル保存やピクセル配列としての読み出しまで行いたい場合は、Render TargetのピクセルをFColor配列として読み出す処理が必要になり、ここはC++や追加のプラグインに頼ることが多くなります。
キャプチャのタイミング制御は従来どおりブループリントのイベントで行えます。たとえば、特定の入力やゲーム内イベントを起点にCapture Scene系の更新を呼ぶ、といった構成です。なお、Scene Capture 2Dは常時キャプチャ(毎フレーム更新)にしておくと負荷が高くなるため、必要なタイミングだけ更新する設定にして、撮りたい瞬間にブループリントから明示的にキャプチャを走らせると、パフォーマンスを抑えつつ目的の絵を得やすくなります。
FrameGrabberをC++でBPに公開する場合の考え方
どうしてもFrameGrabberそのものをブループリントから扱いたい、あるいは毎フレームの描画結果を低レイテンシで受け取りたい場合は、C++で薄いラッパーを用意します。基本方針は「FFrameGrabberの生成・開始・取得・停止をC++側に閉じ込め、ブループリントには操作の入り口だけを公開する」というものです。
- キャプチャ管理用のアクター、またはサブシステムをC++で作成する。
- その内部で
FFrameGrabberを生成し、StartCapturingFramesで開始、必要なフレームでCaptureThisFrame、結果をGetCapturedFramesで受け取る。 - 「開始」「1枚取得」「停止」などの操作を
UFUNCTION(BlueprintCallable)として公開し、ブループリントからノードとして呼べるようにする。 - 取得したフレームデータ(ピクセル)は、テクスチャ化したり、外部送信や保存処理へ渡したりする。
この構成にしておくと、タイミングや条件分岐といったゲームロジック側はブループリントで組みつつ、重い描画取得処理はC++に任せられます。ビルド設定では、MovieSceneCaptureモジュールへの依存をBuild.csに追加する必要がある点に注意してください。実装コストは高めなので、要件が単発のスクリーンショットやサムネイル生成にとどまるなら、前述のScene Capture 2Dやコンソールコマンドで済ませるほうが手間に見合います。
// 最終画面をそのまま保存したいだけなら、コンソールコマンドが手軽 // Blueprint: Execute Console Command ノード Command: "HighResShot 1920x1080" |
上記のHighResShotは、実際に表示されている最終画面(UIを含む構成も可能)を高解像度でキャプチャし、プロジェクトのSaved/Screenshots以下へ保存します。FrameGrabberのように描画結果をプログラム内で連続的に扱う用途には向きませんが、「ボタンを押したらスクリーンショットを残す」程度であればこれで十分です。
落とし穴・注意点
| 注意点 | 内容 |
|---|---|
| FrameGrabberにBP標準ノードは無い | FFrameGrabberはC++のクラスで、そのままではブループリントから呼び出せません。BPで使うにはC++ラッパーが必須です。 |
| C++実装が必要になる場面が多い | 連続フレーム取得・動画化・外部への映像転送など本格的な用途では、C++(MovieSceneCaptureモジュールの参照や独自プラグイン)が前提になります。 |
| パフォーマンスとメモリ | 毎フレームのキャプチャやピクセル読み出しはGPU→CPU転送を伴い、コストが高くなりがちです。解像度・頻度を抑え、高解像度を常時取得し続けない設計が無難です。 |
| 取得対象の違い | Scene Capture 2Dは原則として3Dシーンが対象で、HUDやUMGのUIは含まれないことがあります。UI込みの最終画面が欲しい場合はスクリーンショット系を使います。 |
| バージョン差・API変更 | キャプチャ周りのAPIやノードはエンジンのバージョンで挙動・名称が変わることがあります。利用中のUE5バージョンのドキュメントで最新の仕様を確認してください。 |
よくある質問(FAQ)
Q. ブループリントだけでFrameGrabberを使えますか?
A. FrameGrabber(FFrameGrabber)はC++のクラスで、ブループリントの標準ノードとしては提供されていません。BPだけで完結させたい場合は、Scene Capture 2D+Render Target、またはハイレゾスクリーンショット用のコンソールコマンドを使うのが現実的です。FrameGrabber本体を使いたいなら、C++で実装してBPへノード公開する必要があります。
Q. UI(HUDやUMG)を含めた画面を保存したいときは?
A. 実際に表示されている最終画面を取りたい場合は、HighResShotなどのスクリーンショット系コマンドが確実です。Scene Capture 2Dは基本的に3Dシーンの描画が対象で、UIが含まれないことがあります。
Q. リアルタイムで毎フレーム画面データを処理したい場合はどうすればよいですか?
A. 低レイテンシで連続的にフレームを取り出す必要があるなら、FrameGrabberをC++で利用するのが向いています。StartCapturingFrames/CaptureThisFrame/GetCapturedFramesといった処理をアクターやサブシステムにまとめ、開始・取得・停止をBlueprintCallableなノードとして公開すれば、タイミング制御はブループリント側から行えます。ただし実装・パフォーマンス調整の負担は大きくなるため、用途が「スクリーンショット」程度であれば前述の代替手段で十分です。
まとめ
FrameGrabberはレンダリング結果を効率よく取得するためのC++のAPIであり、ブループリントから直接呼べる標準ノードはありません。したがって、ブループリント中心で画面を取得したい場合は、まずScene Capture 2D+Render Targetやハイレゾスクリーンショットのコンソールコマンドといった代替手段を検討し、連続フレーム取得や動画化など本格的な用途で必要になったときに、FrameGrabberをC++でラップしてBPへ公開する、という順序で考えると無理がありません。目的(最終画面か3Dシーンか、単発か連続か)を整理したうえで、最小のコストで要件を満たす手段を選びましょう。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?