- 2020/01/30 【Unity】【C#】文字列の暗号化・復号化を簡単に行う
- 2019/09/12 【Unity】【C#】BMP をランタイムで読み込む
- 2019/06/13 【Unity】Unity2019.3 で Android / iOS ネイティブの構成が変わるらしい
- 2019/03/24 【Unity】【C#】アセットバンドルのキャッシュを調べて不要なものを消す
- 2019/02/25 【Unity】Firebase のプッシュ通知と FantomPlugin の共存(Firebase と他のプラグインの共存方法)
【Unity】【C#】文字列の暗号化・復号化を簡単に行う 
2020/01/30 Thu [edit]
今回は手軽にデータの暗号化・復号化が行える「Unity Cipher」というオープンソースライブラリを紹介しよう。
実際にはコードを見てみると、特に Unity 以外でも使えそうだが、デモ(Examples)が Unity で作られているからだろうか?とても簡単で強固なセキュリティが確保できるので、パスワードや何らかのアカウントデータなどを扱うアプリなら、導入を検討した方が良いだろう。
詳しい内容などはライブラリ作者直々の記事があるので、そちらを参考にして欲しい。ここではどちらかと言うとオープンソースライブラリなど、余りサードパーティを利用したことのない人のためにも、細かい導入手順を書いておく。
・Unity(C#) で「正しい」暗号化処理をするライブラリを作成しました
(※) Unity 2019.2.18f1 / Windows10(x64) で確認
※掲載時点 1.2.0 では 2019.2.17f1 で作られているようだが、コードにバージョン依存性はあまり無いと思うので、少し古い Unity バージョンでも問題なく使えると思う(少なくとも Unity2017 では使えた)。
■ライブラリのインポート
まずは github でライブラリをダウンロードしよう。「Clone or download」から zip をダウンロードできるので、落としたら解凍して、「UnityCipher.unitypackage」を Unity にインポートする(プロジェクトビューにドラッグ&ドロップすると楽)。
・Unity Cipher (MIT License)

インポートできたら、「Assets/UnityCipher/Plugins/UnityCipher/」フォルダにある cs ファイルがライブラリ本体となる。
デモ(Assets/UnityCipher/Examples/ 以下)が必要無いなら、これらファイルだけ導入しても構わない。

ちなみに「Plugins」フォルダに入れておくことは、スクリプトのコンパイル順に関係する事なので、汎用的なライブラリは Plugins 以下に配置されていることが多い → UniRx(AssetStore版)等
・特殊フォルダーとスクリプトのコンパイル順 (Unity Manual)
簡単な使い方はデモを見るのが早いかも知れない。「Assets/UnityCipher/Examples/ 」に「Example」シーンがあるので、起動してみると良いだろう。

オススメは「Rijndael」だ。サンプルコード上では「Examples/Scripts」フォルダ以下の「RijndaelContent.cs」を開けば、だいたい使い方がわかると思う。例えば、暗号化・復号化の部分を抜き出せば次のようになる。
●UnityCipher での暗号化・復号化
using UnityCipher;
//暗号化
string encrypted = RijndaelEncryption.Encrypt(planeText, passwordText);
//復号化
string plane = RijndaelEncryption.Decrypt(encryptedText, passwordText);
encrypted = I8WWDJbFzGCN4OiauU7H1w2PSOTCFDZUIMXD000pA3bq4T4g06lNvzxSlW8qQEMF4agkUfrnFfL4eXRd9AtaSlI2TZpuwZF7dH1+sYwaNBvOty2ImJJuaqVWEdWbjfB6
(次に、暗号化[エンコード]された文字列(encrypted)を復号化すると[→ passwordText は同じものを使う])
plane = "hogehoge"
このライブラリの優れた所は、デモでもう一度同じ文字列を暗号化して貰えるとわかると思うが、毎回違う文字列が生成される点だ(ライブラリ作者の記事に詳しく書いてある)。つまり文字列の並びから中身は想定はされずらいので、セキュリティ的にも安全性が高くなる(世の中には本当に凄い人もいるもので、実際に学会などで新しい暗号化方式を、何度かパターンを見ただけでやぶってしまう人もいるという…)。
また注意点としては、当たり前だがパスワードは難しいものにしておいてね…と(笑)("password" とか "admin" とかはダメですよ(笑))。
Unity においては例えば PlayerPrefs に使っても良いかも知れない。ただし、文字列が長くなるので、Android/iOS には大量にやらない方が良いかも(Android は ~.xml, iOS は ~.plist に書き出されるため)。もしキーと値を両方暗号化したいなら、キーには「ハッシュ値」を使うのもアリだろう。
・【C#】MD5, SHA1, SHA256, SHA384, SHA512 等のハッシュ値を生成する
・【Unity】PlayerPrefs, persistentDataPath, temporaryCachePath の保存場所(パス)一覧表
また、github の Usage にも書いてあるが、byte[] も使えるので、バイナリデータを暗号化するにも良いだろう。使い方は同様なので難しくはないと思う。
(関連記事)
【C#】MD5, SHA1, SHA256, SHA384, SHA512 等のハッシュ値を生成する
【C#】GUID の生成と書式
【Unity】PlayerPrefs, persistentDataPath, temporaryCachePath の保存場所(パス)一覧表
【Unity】【C#】BMP をランタイムで読み込む 
2019/09/12 Thu [edit]
実は VRM Live Viewer には既に導入されているのだが、BMP を画像素材(テクスチャ)として利用したいこともあるだろう。実装当時、ググっても英語サイトしか出てこなかったので、需要は少ないのかも知れないが、探すのに苦労しないように備忘録として残しておく。
今回紹介する方法は、オープンソースの BMPLoader を使う方法だ。
以前「ランタイム時にファイルをドラッグ&ドロップして取得する」で紹介した「UnityWindowsFileDrag-Drop」の作者の Bunny83 さんの配布ライブラリで、とても簡単に扱えたので、その方法を書いておこう。
(※) Unity 2018.4.8f1 / Windows10(x64) で確認
■BMPLoader を導入する
導入方法は簡単だ。以下の公開サイトへ行き、コピペで C# ファイルを作って欲しい。ページの一番下の方に「Raw Paste Data」という欄があるので、ここからコピーするのが簡単だろう。
・BMPLoader.cs
■簡単なサンプルを作ってみる(基本的なコード)
ググってみるといくつか出てくるので、以下などを参考にするのも良いだろう。
・How to load a BMP file in binary?
・How can I use a .bmp file and create a Texture in Unity at runtime?
実際には BMPLoader.LoadBMP() はいくつかオーバーロードがあるので、利用方法によって使い分けるのも良いかも知れない。ここでは後述する「非同期ロードに対応してみる」に合わせた書き方となっている。定義をみて自分なりに書き換えるのも良いだろう。
●BMPLoadTest.cs(※名前は任意)
using System.IO;
using UnityEngine;
using UnityEngine.UI;
using B83.Image.BMP;
public class BMPLoadTest : MonoBehaviour
{
public RawImage image; //読み込み先(※インスペクタで UI を設定)
public string filePath = "c:/test/image/sample.bmp"; //※ファイルは任意
// Use this for initialization
private void Start()
{
var bytes = File.ReadAllBytes(filePath);
var loader = new BMPLoader();
//loader.ForceAlphaReadWhenPossible = true; // can be uncomment to read alpha
var bmpImage = loader.LoadBMP(bytes);
image.texture = bmpImage.ToTexture2D();
}
private void OnDestroy()
{
if (image.texture != null)
{
Destroy(image.texture);
image.texture = null;
}
}
}
このサンプルではエラーのチェック等は省略しているので、あくまで全て必要なもの(ファイルとか)が揃っている場合であることを留意しておいて欲しい。
とりあえず、BMP をロードして表示できたなら成功だ。
■非同期ロードに対応してみる
とりあえず前述の基本的なコードでも十分なのだが、動作確認が取れたなら、ちょっと手を加えて非同期読み込みすると良いかも知れない。ただし、以下のコードは .NET 4.x 以降である必要がある。
●BMPLoadTest.cs(※名前は任意)
using System.IO;
using System.Threading.Tasks; //※追加
using UnityEngine;
using UnityEngine.UI;
using B83.Image.BMP;
public class BMPLoadTest : MonoBehaviour
{
public RawImage image; //読み込み先(※インスペクタで UI を設定)
public string filePath = "c:/test/image/sample.bmp"; //※ファイルは任意
// Use this for initialization
private async void Start() //※async を追加
{
var bytes = await Task.Run(() => File.ReadAllBytes(filePath)); //※Task で別スレッドで読み込み
var loader = new BMPLoader();
//loader.ForceAlphaReadWhenPossible = true; // can be uncomment to read alpha
var bmpImage = await Task.Run(() => loader.LoadBMP(bytes)); //※Task で別スレッドでロード
image.texture = bmpImage.ToTexture2D();
}
private void OnDestroy()
{
if (image.texture != null)
{
Destroy(image.texture);
image.texture = null;
}
}
}
ファイルの大きさにもよるが、私が計測したところ、非同期にすれば約1.5倍くらいの速度で読み込める。もし、UniRx を使っているのなら、Task は UniTask にした方が良いだろう。
ここでは簡単なサンプルなので Start() でやってしまったが、static なメソッドにしてしまえば、使い回しもできて非常に便利だ。その場合にはファイル名やファイル自体の存在チェック、非同期キャンセルのための CancellationToken など入れた方が良いだろう。Task.Run() は2回に分けてあるが、ファイル読み込み/テクスチャとしてロードするのに時間がかかることを考慮して、それぞれにキャンセルチェックをした方が良いと思う(きちんと実装すると結構長くなるため、今回は要点だけにした)。その辺りはご自由に(笑)。
ちなみに私が提供しているプラグインを使えば、Android でも BMP を読み込めた。実際にスマホで全天球ビューワを作ることも可能だ(これが VRM Live Viewer で実装されている)。
(関連記事)
【Unity】【C#】TGAをランタイムでロードする
【Unity】【C#】ランタイム時にファイルをドラッグ&ドロップして取得する(Windows のみ)
【Unity】スマホで簡易360度(パノラマ, 全天球)ビューワを作る
【Unity】Androidのトーストやダイアログ、通知、音声認識、ハード音量操作など基本的な機能を使えるプラグインを作ってみた
【Unity】AssetStore版 FantomPlugin のセットアップ
【Unity】Unity2019.3 で Android / iOS ネイティブの構成が変わるらしい 
2019/06/13 Thu [edit]
Unity Asset Store にプラグインを出していることもあって、デベロッパーのメルマガで Unity2019.3 の大きな変更点が送られてきた。
どうやら今までの Unity での Android / iOS ビルドの際のネイティブの構成が変わるらしい。
まぁ、自分でプラグインなど作ったりしない場合はあまり関係ないと思うが、Unity2018.2 からは Android も Java コードをそのままビルドできるようになったので、ネイティブを使う人なら知っておいた方が良いだろう。
詳細は公式のフォーラムを見た方が良いと思うが、例えば Android では 2019.3 で以下のような構成になるようだ。
・Using Unity as a library in native iOS/Android apps
また、Unity2019.3 からは今までと違って、ランチャーを挟んで本体の起動できるようだ。複数のアクティビティを使わないなら、あまり必要もないかもだが、例えば通常のアプリでの画面と Unity での 3Dモードで開くなど、今までより簡単にできるかも知れない。ただし『アンロードボタンは、単にアクティビティを破棄するのではなく、実際にアプリを終了します』とあるね。これも公式のフォーラムを見た方が良いだろう。
・Integration Unity as a library in native Android app
まぁ、見た感じ私の提供しているプラグインはそのまま動きそうな気がするが、確認が取れるまで、Unity2019.3 以降ではフィルタされるようだ(メルマガに書いてあった)。
Unity の GUI も Flutter ライクのワークフローで開発できるパッケージも提供され始めたしね。UIWidgets は UIを1ドローコールで60fps以上の高効率でレンダリングできるらしいし、ネイティブのような画面遷移できるらしい。動画観てみると Unity とは思えない画面だね(笑)。
・UIWidgets (Asset Store)
・UIWidgets (github)
・【Unity提供アセット】FlutterライクのワークフローをUnityで実現!強力なUIプラグインパッケージが新登場。60fps以上のレンダリング効率、クロスプラットフォーム対応。1ドローコールで描画する「UIWidgets」
以上の情報からもネイティブ統合は今後強化されるかもね。
(関連記事)
【Unity】Unity2019 の StandardShader の処理が少し変わったらしいよ
【Unity】Unity2018.3.2 にアップグレードすると見た目がおかしくなることがある
【Unity】Android アプリでパーミッション(権限)要求をする
【Unity】IncrementalCompiler でのエラー:Unloading broken assembly Packages/com.unity.incrementalcompiler/Editor/Plugins/Unity.PureCSharpTests.dll, this assembly can cause crashes in the runtime
【Unity】Unity2018 でビルドエラー「CommandInvokationFailure: Gradle build failed.」が出る
【Unity】【C#】アセットバンドルのキャッシュを調べて不要なものを消す 
2019/03/24 Sun [edit]
もう随分 AssetBundle Manager を触ってなかったのだが、ちょっと利用する機会があったのでメモ。
どうやら Unity2017 以降にはキャッシュの操作もできるようになったみたいなので、キャッシュの存在確認や不要なキャッシュを簡単に削除できると良いと思った。
この AssetBundle Manager はUnity5 時代のもので、もうアセットストアからは落とせないみたいだが、まだお世話になってる人のためにも機能追加案を書いておこう。他のツール使ってるなら必要ないかもだが、同じような考え方なら流用もできるだろう。
(※) Unity2018.3.9f1 / Windows10(x64) で確認
●マニフェストからハッシュを取得
//マニフェストからハッシュを取得
static public Hash128 GetAssetBundleHash(string assetBundleName)
{
return m_AssetBundleManifest.GetAssetBundleHash(assetBundleName); //※先にマニフェストをロードしておく必要あり
}
この関数はレガシーな AssetBundle Manager を基にしてるので注意(スコープや書き方も合わせている)。
これは元からある AssetBundleManifest.GetAssetBundleHash を少し簡単にしただけのものなので、あまり説明はいらないだろう。このハッシュは実際にマニフェストに書かれているもので、テキストエディタなどで「~.manifest」を開けば、それぞれの「AssetFileHash」に対応していることがわかる。もう結構古い記事になるがテラシュールさんの記事に詳しく書いてあるので、参考資料として載せておこう。
・AssetFileHashとTypeTreeHashは、AssetBundleの更新判定
・AssetBundleManifest.GetAssetBundleHash
●アセットバンドルがキャッシュに存在しているか?(url と hash を用いる)
//アセットバンドルがキャッシュに存在しているか?
static public bool IsExistCaching(string assetBundleName)
{
var url = BaseDownloadingURL + assetBundleName;
var hash = GetAssetBundleHash(assetBundleName);
return Caching.IsVersionCached(url, hash);
}
この関数もレガシーな AssetBundle Manager を基にしてるので注意(スコープや書き方も合わせている)。GetAssetBundleHash は前述したものだ。
なぜだかわからないが、この関数はわりと昔からあって(Unity5 の時代からあったらしい?)、マニュアルにも載ってるバージョンとそうでないバージョンがある。
IsVersionCached(string url, int version) の方は Obsolete(廃止予定)だし、version の指定はどちらかというと、アセットバンドル全体のバージョンという感じで、個々のアセットバンドルの差分としては使いづらいんだよね(この version は WWW.LoadFromCacheOrDownload [obsolete] や UnityWebRequestAssetBundle.GetAssetBundle などの引数に当たる)。なので、ハッシュの方を使いたいことが多い。まぁ、url 指定なので少し使いづらいが…。
また、ハッシュと任意の名前を用いることもできる。ここでは名前をアセットバンドル名としておくと、以下のようなものも作れる。
●アセットバンドルがキャッシュに存在しているか?(url と name を用いる)
//アセットバンドルがキャッシュに存在しているか?
static public bool IsExistCaching(string assetBundleName)
{
var hash = GetAssetBundleHash(assetBundleName);
var cab = new CachedAssetBundle()
{
hash = hash,
name = assetBundleName,
};
return Caching.IsVersionCached(url, hash);
}
こちらの方が使いやすいかも知れない。url をキーとしてないので、移動しても使える。
ついでに色々資料も載せておこう。
・キャッシュの存在確認
・Caching.IsVersionCached
・WWW.LoadFromCacheOrDownload [obsolete]
・UnityWebRequestAssetBundle.GetAssetBundle
●現在のハッシュ以外のキャッシュを消す
//現在のハッシュ以外のキャッシュを消す(※使うタイミングに注意)
static public bool ClearOtherCaching(string assetBundleName)
{
var hash = GetAssetBundleHash(assetBundleName);
return Caching.ClearOtherCachedVersions(assetBundleName, hash);
}
この関数もレガシーな AssetBundle Manager を基にしてるので注意(スコープや書き方も合わせている)。GetAssetBundleHash は前述したものだ。
これは割と最近(Unity2017.1 以降?)にできてたらしい。調べていたら出てきたので、試してみたら上手く行った。実行は同期的なのでタイミングには気をつける必要があるが(まだ古い使用中アセットがあった場合、途中破棄されるわけで)、他にも削除する方法はあるみたいなので、色々やってみるのも良いかも知れない。また、資料には「デフォルトで150日間で期限切れ」ともあるね。以下に記事も載せておこう。
・[Unity 2018.2] AssetBundleのキャッシュを完全に理解する
・期限切れによる削除
・Caching.GetCachedVersions
まぁ、この AssetBundle Manager 自体は旧時代のものなので、これからも使うなら少し書き直した方が良いかも知れない。WWW よりも UnityWebRequest の方がパフォーマンス良いと聞いたこともあるし、実際に書き換え例なんかもあるので、自分でやってみると良いかも(Unity2019 には Addressable Assets というものも出てくるらしいしので今更だが(笑))。
・AssetBundleManagerのwwwをUnityWebRequestに変えて、さらにキャッシュの古いバージョンを削除してみる
(関連記事)
【Unity】【C#】AssetBundleManager を WebGL で使う・エラー対処法
【Unity】【C#】Addressable Assets でキー(アドレス)の存在(登録)を調べる
【Unity】Firebase のプッシュ通知と FantomPlugin の共存(Firebase と他のプラグインの共存方法) 
2019/02/25 Mon [edit]
ちょっと最近 VRM Live Viewer に構いっきりで(笑)、FantomPlugin の更新の方が滞っているのだが、Android 8.0 以降では通知システムも変わってしまったので、試しに Firebase のプッシュ通知をオーバーライドできるかやってみた。結果はそれほど難しく無く可能だったので、細かい部分はカスタマイズした方が良いと思うが、導入もできると思う。あくまで簡単な例となるが、FantomPlugin と Firebase の共存の方法を提供しておこう。
ただ、この機能は Unity2018.2.x 以降のプロジェクト内で Java をプラグインとして扱えるようになったおかげで使えるようになったものなので、必要であれば、以下の記事も参照して欲しい。
・【Unity】【C#】プロジェクト内で Android(Java)プラグインをビルドする
●Firebase SDK のインポート
●FantomPlugin のインポート
■FantomPlugin オーバーライド用 Acrivity の導入
■Firebase の準備
■アプリをビルドする
■Firebase からプッシュ通知を送る
(※) Unity2018.3.5f1 (Unity 2018.2 以降) / Firebase SDK 5.5.0 / Windows10(x64) で確認
■プラグインの導入
大まかには Firebase SDK と FantomPlugin の2つを用意することになる。といっても、ここではオーバーライドするプラグインの例に FantomPlugin を使っているというだけで、考え方さえわかれば、他のプラグインに Firebase を利用することも可能だろう。
●Firebase SDK のインポート(掲載時点 SDK ver.5.5.0)
Firebase のプッシュ通知を利用するには、公式から配布されている Unity 用のパッケージを導入する必要がある。以下のページに「SDK をダウンロード」というボタンがあるので、クリックして zip をダウンロード→解凍して欲しい。
・Unity プロジェクトに Firebase を追加する
zip を解凍すると、「dotnet4」というフォルダがあるので、その中から「FirebaseMessaging.unitypackage」をインポートしよう。これには Firebase からプッシュ通知を受け取るアクティビティやマニフェストファイル、API などが含まれている。初回のインポートでは依存関係のライブラリを自動導入するので、結構時間かかるかも知れない(※Build Target が Android になってない場合はここでやっておくと良い)。また、「dotnet3」にも同じものが入っているが、これは .NET 3.x 時代のもので、Unity2018 ではデフォルトで .NET 4.x となっているので、ここでは不要だ。
Resolver(依存関係の解決)が終わったら、大量のファイルが「Assets/Plugins/Android」に配置されていると思う。Firebase を既存のプロジェクトに使うだけなら、ここにある「AndroidManifest.xml」はあまりいじる必要はないが(だいたい自動でやってくれる)。他のプラグインと共存するには少し手を加える必要がある。その辺りは後で説明しよう。
●FantomPlugin のインポート
とりあえず今回はアセットストア版の「FantomPlugin (Android Native Dialogs and Functions Plugin)」(※長いので略してるだけ(笑))を使って説明しよう。Google Drive 版を使っている人でも基本的には同じなので、パス名などを置き換えてもらえばできると思う。
より詳しいセットアップは「AssetStore版 FantomPlugin のセットアップ」の記事にも書いてあるが、簡単な方法としてはエディタ上で [Ctrl+9] でアセットストアを開き「Android Native Dialogs and Functions Plugin」を検索すれば、すぐに出てくると思うので、とりあえずダウンロード→インポートして欲しい。
■FantomPlugin オーバーライド用 Acrivity の導入
インポートが終わったら、もう1つプロジェクトに追加して欲しいものがある。それは先ほど保留した 「AndroidManifest.xml」 に関わる問題でもある。というのは Firebase SDK のインポート で作られたマニフェストファイル(AndroidManifest.xml)は Firebase 専用となっている。この辺りの説明は少し難しくなってしまうのだが、なるべく簡単に説明すると、この「Firebase 専用のものをオーバーライドすることにより、他のプラグインの機能を共存してしまおう」ということだ。そのオーバーライドするのに必要な Activity を用意した。そのうち、アセットストア版にも出すつもりだが、とりあえずは先行配布としてこれを使って欲しい。
ダウンロードして zip を解凍すると「Firebase」フォルダに「OverrideFantomPluginOnFirebaseMessagingActivity.java」というのが入っていると思う。これは現在使われている「FantomPlugin」と同じもので、Unity2018.2 のプラグイン用の Java コードをプロジェクト内でビルドするために作ってみたものだ(内容的にはプラグイン「fantomPlugin.aar」の内部に入ってる「FullPluginOnUnityPlayerActivity」と全く同じ)。

また、「AndroidManifest_FirebaseMessaging.xml」というのも入っているが、これは Firebase の「AdnroidManifest.xml」に「OverrideFantomPluginOnFirebaseMessagingActivity」をオーバーライドするように修正したものだ。Firebase のデフォルト設定に追加しただけのものなので、必要あれば編集した方が良いかも知れない。
これらをプロジェクトのプラグインルート「Assets/Plugins/Android/」以下に置いて欲しい。ここに Java ファイルを置いておけば Unity が自動でビルドしてくれる(Build System が「Gradle」のときのみ[※Unity2018 はデフォルト])。
また、元の「AndroidManifest.xml」はリネームして「AndroidManifest_old.xml」とでもしておき、「AndroidManifest_FirebaseMessaging.xml」を「AndroidManifest.xml」にリネームすると、オーバーライドが有効になる。

この辺りの内容は少し難しくなるので、簡単に説明にしておくと、「UnityPlayerActivity(Unity)継承→ MessagingUnityPlayerActivity(Firebase)継承→ OverrideFantomPluginOnFirebaseMessagingActivity(FantomPlugin)」のようにオーバーライドされていることになる(※つまり自作するときは同じように、競合しないようなオーバーライドする Activity を作れば良い)。
必要なら参考資料を載せておこう。ダウンロードした zip の中の「Default」フォルダがあると思うが、その中にある「OverrideFantomPluginOnUnityPlayerActivity.java」はデフォルトの「UnityPlayerActivity」を継承している。Firebase のオーバーライドと同じように継承するものを変更すれば、他のプラグインもオーバーライドできるかも知れない。
・UnityPlayerActivity Java コードの拡張
・Activity
・アプリ マニフェスト
■Firebase の準備
アプリ方の準備はだいたい終わったので、次のプッシュ通知を送信する Firebase自体をセットアップしよう。
1.Firebase をまだ利用してない人は、まずは登録しよう。といっても Google アカウントを持っていれば、サイトに行けばすぐに新規登録できると思う。登録完了したら、いつでも画面の右上あたりにある「コンソールへ移動」があるので、プロジェクト管理へ移動できる。
2.コンソール(「Firebaseへようこそ」)へ来たら、プッシュ通知を利用するプロジェクトを作成しよう。「+プロジェクトを追加」を押して、プロジェクト名などを任意に入力し、「プロジェクトを作成」ボタンを押せば良いだけだ。完了したら、プロジェクトへ移動しよう。

3.初回の場合、プロジェクトにはアプリが追加されてないので以下の画面が出ると思う。今回は Android のプラグインをオーバーライドする実験なので、Android のアイコンを押そう。

4.「アプリの登録」の「Android パッケージ名」は Unity の Identification と合わせておく必要がある(※以下のアプリIDは例なので、自分のアプリのIDに置きかえる)。Unity の PlayerSettings(File>Build Settings...>Player Settings...>Other Settings>Identification)を開いてコピペすると良い。ここが1文字でも間違ってたら、通知は届かないので注意しよう。

●Unity 側

※FantomPlugin を使う場合、Android 4.2 以上にする必要がある。
5.これら Firebase の設定を Unity に認識させるために、設定ファイル「google-services.json」をダウンロードしておく必要がある。このファイルは Unity の Assets 直下に置くことで反映される(ID の紐づけ)。

●Unity 側

6.次の「Firebase SDK の追加」は Unity の場合、自動でやってくれるので必要ない。

7.最後の「アプリを実行してインストールを確認」はスキップしてしまって良いだろう。

■アプリをビルドする
これまでの準備が整ったらアプリをビルドしてみよう。注意すべき点は、「OverrideFantomPluginOnFirebaseMessagingActivity.java」「AndroidManifest_FirebaseMessaging.xml(AndroidManifest.xml)」「アプリのID(Android パッケージ名/Identification)」「google-services.json」だ。結構大変だが、置く場所なども含めて確認して欲しい。
確認が取れたら、ビルドするシーンは何でも良いが、FantomPlugin のデモなら、「FantomPlugin/Demo/Scenes/」以下に置いてある。それらを「Build Setting>Scenes In Buildに追加し、「Player Settings...」で「Minimum API Level」が 4.2 以上(※これは FantomPlugin の仕様。できれば 5.0 以上の方が良いかも知れない)になってればOKだ。ビルドして一度起動してみよう。また、今回は通知を受信する実験をするだけなので、アプリはすぐに終了して構わない。


■Firebase からプッシュ通知を送る
ここまででの手順が間違ってなければ、既に Firebase からプッシュ通知の送信ができるようになっている。Firebase のコンソール へ行き、左のメニューから「Cloud Messsaging」へ移動しよう。初回なら「Send your first message」のボタンが出るので、それを押すとメッセージを作成することができる。

1.通知の作成画面では任意にテキストを入力して行こう。気をつけて欲しいのは既にリリースされているアプリの場合、適当に入力したものがユーザーに届いてしまうことである。その辺は自己責任で(笑)。

2.一番重要なのは、このターゲットのアプリ(ID)だ。ここを Unity のアプリの Identification と同じにすることによって、そのアプリ用の通知として送られる。間違えないようにしよう(Android / iOS などでも分別できる)。

3.以降の「スケジュール設定」は「Now」(今すぐ)で、「コンバージョンイベント」はデフォルトで良いだろう。「その他のオプション」では「Android 通知チャンネル」という項目があるが、これは Android 8.0 以降の「通知チャンネル」の機能で、通知ごとに種類を分別できるようにするものだ(例えば「お知らせ」とか「更新情報」とか、別々に通知のオン・オフできるようにするため)。Android 8.0 より前の機種では分別はされない。
・Android O(APIバージョン26)のPush通知

4.最後の「メッセージの再確認」では「公開」ボタンを押すと即送信されるので(スケジュールで「今すぐ送信」(Now)の場合)、間違いがないか確認してから押そう。ユーザーに飛んでいってしまうので、もう取り消せない(笑)。

5.履歴が表示されていれば、送信完了だ。通信状態・サーバー状況などによって、タイムラグが出ることもあるが、成功していればおおよそすぐに通知が来ると思う。実機で確認してみよう。


※アイコンは Unity で設定したものが表示される(空だと Android のデフォルトアイコンになる)
(関連記事)
【Unity】【C#】プロジェクト内で Android(Java)プラグインをビルドする
【Android】【Java】パーミッションの付与(許可)のチェックと要求をする
【Unity】Androidのトーストやダイアログ、通知、音声認識、ハード音量操作など基本的な機能を使えるプラグインを作ってみた
【Unity】AssetStore版 FantomPlugin のセットアップ
- 関連記事
category: Unity
thread: ゲーム開発
janre: コンピュータ
tag: Unityライブラリ Unityプラグイン Unityオープンソースライブラリ Firebase FantomPlugin