LoginSignup
3
1

Unity モバイル端末でUI無しのAR画面だけのスクリーンショットを撮影する方法

Last updated at Posted at 2023-07-30

概要

ARアプリを作成した際に、共有用にスクリーンショットを撮りたい場面があるかと思います。

画面そのままならスマホ側のスクショ機能を用いれば良いですが、UIを取り除いたARシーンだけ撮影したい場合、Unity側で実装をする必要があります。
本記事ではカメラロールに保存するためのパッケージであるNativeGalleryパッケージを用いた実装を解説します。

サンプルプロジェクトのソースコードはこちら
https://github.com/Arihide/unity-mobile-ar-screenshot

解説

サンプルの作成の流れを説明します。
ビルドが大変なため、Androidに絞って解説しますが、iOSでも同様にビルドすれば動作します。

AR・UIシーン作成

まずスクショ確認用のプロジェクトを作成します。

今回はUnity側に準備されているARテンプレートを使用します。
スクリーンショット 2023-07-20 17.56.48.png

サンプルシーンを開きます
スクリーンショット 2023-07-26 19.54.10.png

SampleSceneにCubeObjectプレハブを配置します。
スクリーンショット 2023-07-30 14.57.54.png

続いて、UI描画用のカメラとキャンバス・スクショ用ボタンを用意します。
スクリーンショット 2023-07-30 15.11.22.png

今回はUIのRender ModeをScreen Space - Overlayで描画していますが、この場合後述するRenderTextureを用いたスクショ撮影にはUIが乗らない性質があるため今回はそれを利用します。

Screen Space - Cameraの場合は、別でUI用カメラを用意した上で、Culling Modeを分けることで適切に描画範囲を設定してください。

以上でシーンの設定は完了です

スクショ撮影機能実装

続いてシーン撮影用のスクリプトを記述します。

NativeGallery導入

まず撮影したスクショをカメラロールに保存するためのパッケージである、NativeGalleryをプロジェクトに追加します。

追加方法はmanifest.jsonに以下の1行を足すだけで良いです。

manifest.json
"com.yasirkula.nativegallery": "https://github.com/yasirkula/UnityNativeGallery.git",

パッケージの詳細はGithubページを参照ください。
https://github.com/yasirkula/UnityNativeGallery

スクリプト記述

本命であるスクショ撮影スクリプトを以下のように記述します。
処理の内容についてはコメントを参照ください。

ScreenCapture
using System;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ScreenCapture : MonoBehaviour
{
    [SerializeField] private Camera _captureCamera;

    public void TakeScreenshot()
    {
        // スクショ用の、ARカメラ描画結果を格納するRenderTextureを用意する
        RenderTexture rt = RenderTexture.GetTemporary(Screen.width, Screen.height, 24, RenderTextureFormat.ARGB32);

        // 用意したRenderTextureに書き込む
        RenderTexture prevTarget = _captureCamera.targetTexture;
        _captureCamera.targetTexture = rt;
        _captureCamera.Render();
        _captureCamera.targetTexture = prevTarget;

        // RenderTextureのままでは保存できないので、Textureに変換する
        RenderTexture prevActive = RenderTexture.active;
        RenderTexture.active = rt;
        Texture2D screenShot = new Texture2D(_captureCamera.pixelWidth, _captureCamera.pixelHeight, TextureFormat.ARGB32, false);
        screenShot.ReadPixels(new Rect(0, 0, screenShot.width, screenShot.height), 0, 0, false);

        try
        {
            string timestamp = DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss");

            NativeGallery.Permission permission = NativeGallery.SaveImageToGallery(screenShot, "ShreenshotSample", $"screenshot_{timestamp}.jpg", (success, path) =>
            {
                // 保存終了時のコールバック
            });
        }
        catch (IOException e)
        {
            // 保存時エラーが出た時の処理を記述
        }
        finally
        {
            // 最後にARカメラの描画先をスクリーンに戻す
            RenderTexture.ReleaseTemporary(rt);
            RenderTexture.active = prevActive;
        }
    }
}

撮影したコンポーネントをAR カメラにアタッチします
スクリーンショット 2023-07-26 20.27.49.png

Canvasに追加したButtonコンポーネントのイベントにスクショを追加します
スクリーンショット 2023-07-26 20.33.38.png

これでスクリプトの準備もできました。

ビルド

最後にサンプルプロジェクトをビルドして実機確認しましょう!

まずProjectSettingsのARCoreが有効になっていることを確認します
スクリーンショット 2023-07-26 20.24.27.png

続いてBuild Settingsに移動し、SampleSceneを追加した上でAndroid端末をPCに接続します。
そしてBuild And Runを実行
スクリーンショット 2023-07-26 20.29.02.png

ボタンを押下してUIなし画像が撮れていれば成功です!

Screenshot_20230727-155949(大).jpeg
screenshot_2023_07_27_15_59_52(大).jpeg

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1