Unity×iOS

【Unity×iOS】カメラロール(写真アプリ)に画像を保存する方法|コピペOKのネイティブプラグイン実装

「ゲーム中に撮ったスクリーンショットをカメラロールに保存したい!」
「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プロジェクトに導入してみてください!