はじめに
前回はAndroidプラグインの基本的な作り方についての記事を書きました。
今回は応用編として、MLKitで顔をリアルタイムで検出して、その位置にマスクをかけるアプリを作ります。
UnityのWebCamTexture
を使ってカメラから画像を取得する方法だと、リアルタイムで検出を行うには処理に時間がかかり過ぎてします。
そのため、カメラ画像の取得、テクスチャ変換、顔検出を全てAndroidプラグインで行うことにしました。
本当はもっとふざけたかったのですが、ランドマーク(顔パーツ)の検出まで行うのがリアルタイムだとキツかったので、顔を隠すだけの真面目な記事になりました。
開発環境
- Unity 2019.3.5f1
- Android Studio 3.6.1
- Android SDK Android9.0(Pie)
- Firebase Unity SDK 6.13.0
- Firebase ML 24.0.0
- Pixel 3a
やりたいこと
- リアルタイムで人間の顔を隠したい。
アプリ構成
- Androidプラグイン(Java)
- カメラから画像を取得する。(Camera2API)
- 取得した画像を OpenGL ES 2 テクスチャに変換、テクスチャIDを確保する。(OpenGL ES)
- 取得した画像の中の顔を検出する。(MLKit For Firebase)
- 検出した顔の情報をUnityに送信する。
- Unity(C#)
- Androidプラグインから受信したテクスチャIDでカメラプレビューを描画する。
- Androidプラグインから受信した顔情報を元に顔マスクを作成する。
重要な処理はすべてAndroidプラグインで行います。Unityでは単に描画するだけになります。
Androidプラグインを作る準備
MLKit For Firebaseを使う準備をする
今回は、Firebaseが提供するMLKitを使って顔を検出します。
なので、予めGoogleアカウントを用意してください。
Firebaseのコンソールにプロジェクトを追加します
下記URL先を開き、用意したGoogleアカウントでログインします。
https://console.firebase.google.com/
プロジェクトを追加して、作成中のアプリを登録します。プロジェクト名は自分がわかる任意の名前でOKです。(今回は「FaceMask
」にしました。)

画面の指示に従ってプロジェクトを作成すると以下の画面になります。
今回はAndroidプラグインでFirebaseを使用するので左から2番目のAndroidのアイコンをクリック。

任意のAndroidパッケージ名を登録します。Android StudioでAndroidプラグイン用のモジュールを作る時にこのパッケージ名を指定することになります。

google-services.json
をダウンロードします。
ダウンロードしたgoogle-services.json
を画面の指示通りにモジュールフォルダ直下に追加します。

次にFirebase SDK
をプロジェクトに追加します。
基本は画面の指示通りですが、モジュールレベルのGradleが一部Androidプラグイン用の変更が必要です。
モジュールレベルのGradleは以下のようになります。

Gradleに使用するFirebaseのライブラリを追加する
これでFirebaseを利用する準備ができました。
今回使うライブラリをModuleレベルのGradleに追加します。

JavaをJSONにシリアライズするライブラリを追加する
UnitySendMessage
では文字列しか送信できないため、Unity側に伝える情報をJSONシリアライズする必要があります。
今回は、GoogleのGSON
を使っていきます。

ビルド設定を変更する
ModuleレベルのGradleのminSdkVersion
を確認します。Firebase Unity SDK
がAPI Level 29
に対応していないようなので、minSdkVersion
が29
になっている場合は28
に変更します。

Gradleの変更を反映する
右上のSync Now
をクリックするとGradleの変更が反映されます。Sync Now
が出ていない場合は、File
-> Sync Project with Gradle Files
でも同様のことができます。

Unityプロジェクトの準備
プロジェクトを作成する

UnityプロジェクトにFirebase Unity SDKをインポートする
Firebase Unity SDK
をインポートします。
ここからUnityパッケージの入ったzipファイルがダウンロードできます。
zipファイルの中には複数のUnityパッケージが入っていますが、/{解凍済みフォルダ}/dotnet4/FirebaseAnalytics.unitypackage
をインポートします。

Unityプロジェクトに顔検出用ライブラリを追加する
Assets¥Firebase¥Editor¥AppDependencies.xml
に顔検出用のライブラリを追加します。

UnityプロジェクトにGSONライブラリを追加する
Assets¥Firebase¥Editor¥AppDependencies.xml
にGSONライブラリを追加します。

ライブラリの依存関係を解決する
Firebase Unity SDK
のUnityパッケージに含まれていたExternalDependencyManager
(旧PlayServicesResolver
)を使いライブラリの依存関係を解決します。

準備完了
これで顔検出の準備が完了しました。
次回はいよいよ実装に入っていきます。