最初に
UE4のバージョンは4.27.1
Xcodeのバージョンは13.1
になります。
Android端末でのスクリーンショットの方法に関しては
https://twitter.com/pafuhana1213/status/960199124367716353
おかずさんが公開しているサンプルで可能です。
https://orenda.co.jp/blog/1791/
こちらの記事でもスクリーンショットの撮影方法に関して書いてくれていますので参考になります。
今回はiOSでカメラロールにスクショを保存する具体的な実装例がなく苦労したので一例として記事にしてみました。
スクリーンショットを撮る方法
スクリーンショットを撮るには
FScreenshotRequestのRequestScreenshotで行います。
引数は
InFilename 使用するファイル名
bInShowUI SlateUIを表示するかどうか
bAddFilenameSuffix 自動生成された一意のサフィックスを指定されたファイル名に追加する必要があるかどうか
とあり基本的には
InFilenameに出力先を含めてファイル名を渡す
bInShowUIにUIを表示するかどうかのbool値を渡す
bAddFilenameSuffixは基本的にfalseを渡す
形で使用する事になるかと思います。
iOSでスクリーンショットを撮影
AndroidはRequestScreenshotで端末内のストレージを指定してInFilenameの引数に渡してあげれば端末内のストレージに保存できるのですがiOSは出力先のパスが取得できないので別の方法をとる必要があります。
※UE4のRequestScreenshotを使わずObjective-CやSwiftのスクリーンショット機能を使えば可能だと思いますがUIを写さないで保存するには一度スクリーンショット前にUIを非表示しないといけなかったりiOSだけスクリーンショットの方法が変わるのでできるだけ撮影部分は共通にしたかった為今回はObjective-CやSwiftのスクリーンショット機能は使用していません。
スクリーンショットを撮る方法でスクリーンショットを撮影出来ますがiOSはアプリ内のフォルダに保存されます。
したがってそこから端末内のストレージに保存する必要があります。
まずカメラロールへの保存は非同期なので保存が完了するまで遅延が発生するので完了を通知する関数を用意する必要があります。
カメラロールへの保存はObjective-Cで行うのでそちらで用意する事なります。
///クラスを宣言
@interface ScreenshotSave : NSObject
- (void)onCompleteCapture:(UIImage *)screenImage
didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo;
@end
@implementation ScreenshotSave
//画像保存完了時の関数を実装
- (void)onCompleteCapture:(UIImage *)screenImage
didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
{
//エラーした場合
if(error)
{
UE_LOG(LogTemp, Error, TEXT("Capture Error"));
}
else
{
UE_LOG(LogTemp, Log, TEXT("Capture success"));
}
}
@end
#endif
//保存する画像ファイル名
NSString *ImageName = (NSString*)FPlatformString::TCHARToCFString(*OutFilePath);
//保存する画像を取得
UIImage *Image = [UIImage imageWithContentsOfFile:ImageName];
端末内に保存する画像をUIImageで取得します。
//上記で用意したクラスのインスタンスを生成する
ScreenshotSave* Saveobj = [[ScreenshotSave alloc] init];
//完了を通知する関数をセレクタに登録
SEL Selector = @selector(onCompleteCapture:didFinishSavingWithError:contextInfo:);
//カメラロールに保存する関数を実行
UIImageWriteToSavedPhotosAlbum(Image, Saveobj,Selector, NULL);
これでカメラロールに保存する事ができます。
カメラロールにアクセスする際はInfo.plistにNSPhotoLibraryAddUsageDescriptionを追記する必要があるのでプロジェクト設定->IOS->ExtraPListDataに
<key>NSPhotoLibraryAddUsageDescription</key>\n<string>アルバムに写真を保存します。</string>\n
の形で追加してください。
※"アルバムに写真を保存します。"ここは使用目的に合わせて変える事になります。
info.plistにこの記載が無いとUIImageWriteToSavedPhotosAlbum実行時にアプリがクラッシュする事になります。
後始末としてアプリ内に保存したスクリーンショットは削除しておかないといけないで
IPlatformFile& PlatformFileManager = FPlatformFileManager::Get().GetPlatformFile();
//ファイルを削除する関数
PlatformFileManager.DeleteFile(ここに削除するスクリーンショットのパスを記載);
のような形でアプリ内のスクリーンショットを削除するようにします。
以上がiOSでスクリーンショットをカメラロールに保存する方法になります。
カメラロールへのアクセス許可のチェックやアクセス許可のダイアログをスクリーンショット前に表示する方法は別の記事で投稿致します。
[UnrealEngine iOSでカメラロールへのアクセス許可を求める]https://qiita.com/usagon/items/d62e7746317073ee458e
カメラロールへのアクセス許可を求める方法の記事を投稿いたしました。