「ゲーム中に撮ったスクリーンショットをカメラロールに保存したい!」
「SNS用にキャラクターの写真を直接端末に保存したい!」
UnityでiOSアプリを開発していると、そんなニーズがよく出てきます。
この記事では、UnityからiOSのカメラロール(写真アプリ)に画像を保存する方法を、コピペできるネイティブプラグイン付きで詳しく解説します!
この記事で分かること
- なぜUnity標準だけではiOSカメラロール保存できないのか
- UIImageWriteToSavedPhotosAlbumを使ったネイティブプラグイン作成
- 【コピペOK】Unityから簡単に画像保存するC#連携方法
- カメラロール保存時に気をつけるiOSの権限設定(Info.plist)
Unity標準ではカメラロール保存ができない理由
Unity標準APIには、
- ファイル保存
- テクスチャ保存
- スクリーンショット取得
などの機能はありますが、iOSの「写真アプリ」への直接保存機能はありません。
iOSでは、カメラロールに保存するためには必ず
- UIImageWriteToSavedPhotosAlbum(iOS標準API)
を使う必要があります。
つまり、Unityからネイティブプラグイン経由で保存指示を出す仕組みを作れば、すべて解決できます!
【コピペOK】カメラロール保存用ネイティブプラグイン作成手順
.mmファイルを作成する
まず、
Assets/Plugins/iOS/SaveImagePlugin.mm
を作成し、以下のコードを記述します。
#import <UIKit/UIKit.h>
extern "C" {
void SaveImageToPhotosAlbum(const char* filePath)
{
NSString* nsPath = [NSString stringWithUTF8String:filePath];
UIImage* image = [UIImage imageWithContentsOfFile:nsPath];
if (image != nil)
{
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
}
}
}
ポイント
- 引数はローカルファイルパス(string)で受け取る
- 指定された画像をカメラロールに保存するだけのシンプル設計
Unity側C#スクリプトを書く
これで、
- Unity上で任意のTexture2Dを
- 一時ファイルに保存し
- そのファイルをiOSカメラロールに保存
という流れが実現できます!
using System.Runtime.InteropServices;
using UnityEngine;
using System.IO;
public static class SaveImagePlugin
{
#if UNITY_IOS && !UNITY_EDITOR
[DllImport("__Internal")]
private static extern void SaveImageToPhotosAlbum(string filePath);
#else
private static void SaveImageToPhotosAlbum(string filePath) { }
#endif
public static void SaveTexture(Texture2D texture)
{
string path = Path.Combine(Application.temporaryCachePath, "saved_image.png");
File.WriteAllBytes(path, texture.EncodeToPNG());
SaveImageToPhotosAlbum(path);
}
}
使用例(ゲーム画面を保存する)
ワンタップで現在の画面をカメラロールに保存できます!
using UnityEngine;
public class ScreenshotSaver : MonoBehaviour
{
public void SaveCurrentScreen()
{
StartCoroutine(CaptureAndSave());
}
private IEnumerator CaptureAndSave()
{
yield return new WaitForEndOfFrame();
Texture2D tex = ScreenCapture.CaptureScreenshotAsTexture();
SaveImagePlugin.SaveTexture(tex);
Object.Destroy(tex);
}
}
カメラロール保存時に必要な権限設定(Info.plist)
iOSでは、カメラロールアクセスにはプライバシー設定が必要です。
Xcodeにビルド後、Info.plistに次のキーを追加しましょう。
<key>NSPhotoLibraryAddUsageDescription</key>
<string>このアプリはスクリーンショットをカメラロールに保存するために写真アクセスを要求します。</string>
- NSPhotoLibraryAddUsageDescription は保存専用権限です(閲覧は不要)
- 記述しないとApp Storeリジェクト対象になります!
補足: UnityからPostProcessBuildで自動追加する方法もありますが、最初は手動で設定して問題ありません。
まとめ
項目 | 内容 |
---|---|
Unity標準APIだけではカメラロール保存できない | ネイティブプラグインが必須 |
UIImageWriteToSavedPhotosAlbumで簡単保存可能 | |
C#連携コードもコピペOKで用意 | |
Info.plistに保存用権限設定も必須 |
Unityからカメラロール保存ができるようになれば、
ゲーム中のスクショ共有機能やSNS連携施策も一気に広がります!
ぜひこの記事の手順を参考に、あなたのUnity×iOSプロジェクトに導入してみてください!