Unity×iOS

【Unity×iOS】スクリーンショットをUnityアプリ内で検知する方法|ユーザー操作をトリガーに活用!

ユーザーがスマホでスクリーンショットを撮った瞬間に、「何かアクションを起こしたい!」と思ったことはありませんか?
iOSではスクショイベントをシステム側が通知してくれるため、Unityアプリでもプラグインを使えばスクリーンショット検知が可能です。
この記事では、コピペで使えるObjective-C++プラグインとUnity側連携スクリプトをセットで解説します!

この記事で分かること

  • Unity標準ではスクリーンショット検出ができない理由
  • iOSのNotificationCenterを使ったスクショイベントの受信方法
  • コピペOKのプラグインとC#スクリプト
  • スクショ検知を応用した演出・保護機能アイデア

Unity標準ではスクリーンショット検知できない理由

Unityには「スクリーンショットボタンを押した」というイベントは用意されていません。
iOS側の機能(UIApplicationUserDidTakeScreenshotNotification)が、

  • 電源ボタン+音量上ボタン
  • AssistiveTouchからのスクショなどでのみ発火します。

つまり、Unityだけではスクリーンショット検知は不可能であり、
iOSネイティブコードを経由して検知する必要があるわけです。

iOSネイティブNotificationCenterを使ったスクショ検出

iOSにはシステム通知(NotificationCenter)があり、
UIApplicationUserDidTakeScreenshotNotificationという特別な通知でスクショ撮影が検出できます。

これを利用してUnityにイベントを送ればOKです!

【コピペOK】スクリーンショット検知プラグインを作成

.mmファイルを作成する

プロジェクトに
Assets/Plugins/iOS/ScreenshotDetector.mm
を作成し、以下を記述します。

#import <UIKit/UIKit.h>

extern "C" {

typedef void (*ScreenshotCallback)();
static ScreenshotCallback callback = NULL;

void RegisterScreenshotCallback(ScreenshotCallback cb)
{
    callback = cb;
    [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationUserDidTakeScreenshotNotification
                                                      object:nil
                                                       queue:nil
                                                  usingBlock:^(NSNotification *note) {
        if (callback != NULL)
        {
            callback();
        }
    }];
}
}

ポイント

  • RegisterScreenshotCallback関数でUnityにコールバックを登録
  • スクリーンショット検出時にUnity側に通知する設計です

Unity側C#スクリプトを書く

これをシーンのどこかのGameObjectにアタッチするだけ!

using System;
using System.Runtime.InteropServices;
using UnityEngine;

public class ScreenshotDetector : MonoBehaviour
{
#if UNITY_IOS && !UNITY_EDITOR
    [DllImport("__Internal")]
    private static extern void RegisterScreenshotCallback(ScreenshotCallbackDelegate callback);

    private delegate void ScreenshotCallbackDelegate();
#else
    private static void RegisterScreenshotCallback(ScreenshotCallbackDelegate callback) { }
    private delegate void ScreenshotCallbackDelegate();
#endif

    void Start()
    {
        RegisterScreenshotCallback(OnScreenshotTaken);
    }

    private void OnScreenshotTaken()
    {
        Debug.Log("スクリーンショットが撮影されました!");
        // ここに任意の処理を書く(例:メッセージ表示・アチーブメント解放など)
    }
}

スクショ検知を応用した演出・保護機能アイデア

Unityアプリでスクショ検知を活用すると、いろいろな演出やUX改善ができます。

  • スクショ撮影時に「保存ありがとう!」メッセージを表示
  • 限定スクショボーナス(スクショすると隠しアイテム出現)
  • 著作権保護のためにスクショ検知後にウォーターマークを挿入
  • SNS投稿促進(「スクショをそのままシェアしよう!」誘導)

特にカジュアルゲームやSNS連携コンテンツでは、
スクショ検知はうまく使えば超強力なユーザー体験強化ポイントになります!

まとめ

項目内容
Unity標準Inputだけではスクショ検出不可ネイティブコードが必要
iOSではUIApplicationUserDidTakeScreenshotNotificationを使う
コピペできる.mmファイルとC#コードを紹介
スクショ検知を演出・UX向上に活かせる

「スクショを撮る」行動を、ゲームやアプリの楽しさに変える仕掛けを、ぜひあなたのUnity×iOSプロジェクトに導入してみてください!