ぼっちプログラマのメモ

UE4とかUE5とかについて書いたり書かなかったり。

Texture2D / RenderTargetを指定のフォルダに出力する方法について

f:id:pafuhana1213:20170708005617j:plain
とあるハッカソンで画像出力を実装したかったので調査のついでに記事を書いたり

はじめに

UE4.13でExportTexture2D / ExportRenderTargetノードが追加されました。
f:id:pafuhana1213:20170708002627p:plain

この機能を使うことで、ゲーム中にSceneCapture2Dでキャプチャした結果を出力できたりします。スクリーンショット機能自体は既に標準で用意されていますが、画面上の絵とは別の絵(例えばゲーム中のキャラクタが取った写真)を出力したい場合はこの機能が有用です。(ちなみに標準のスクリーンショット機能については以下の記事で解説してます)
pafuhana1213.hatenablog.com


出力自体はかんたんなのですが、問題はノードの引数にあるFile Pathです。

※ 2017/07/08/1:30 追記
ExportRenderTargetで出力されるファイルは.hdr形式です
。その為、標準のビューワーではおそらく開けません。UE4上のコードで一般的な画像に変換できないか、分かり次第追加します

FilePathの指定内容による出力先の変化

FilePathに何も指定しない場合

f:id:pafuhana1213:20170708013516p:plain

[使用しているエンジンのインストール先]\Engine\Binaries\Win64\test.hdr

FilePathにパスを指定した場合

f:id:pafuhana1213:20170708013547p:plain

D:\TEST\test.hdr
(指定したパスにフォルダが無い場合はフォルダが自動生成される)


これはこれで便利なのですが…大抵の方は、そのプロジェクトやパッケージ内の指定フォルダに出力させたいかと思います。

プロジェクト / パッケージの特定のフォルダに出力するには

FPathsクラスで用意されている関数を使うことで、そのフォルダのパスを取得することができます。
FPaths | Unreal Engine API Reference
Packaged Game Paths, Obtain Directories Based on Executable Location - Epic Wiki

残念ながらBPからこれらの関数を使うことが出来ないため、C++コードを書く必要があります。例えばこんな感じ。

h

#pragma once

#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "OkazuBlueprintFunctionLibrary.generated.h"

UCLASS()
class GIRLFRIENDX_API UOkazuBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{
	GENERATED_BODY()

	UFUNCTION(BlueprintCallable)
	static FString 	GetGameSavedDir();
};

cpp

#include "OkazuBlueprintFunctionLibrary.h"
#include "Misc/Paths.h"

FString UOkazuBlueprintFunctionLibrary::GetGameSavedDir()
{
	return FPaths::GameSavedDir();
}

この例だと、プロジェクトのSaveフォルダにRenderTargetが出力されます。
f:id:pafuhana1213:20170708013645p:plain

最後に

最近は独自のスクリーンショット機能がついたゲームがとても多いです。是非この出力機能を使ってそういったシステムを実装してみて下さい!


おわり