ユーザーがスマホでスクリーンショットを撮った瞬間に、「何かアクションを起こしたい!」と思ったことはありませんか?
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プロジェクトに導入してみてください!