今回はプラグインを使ってセーブデータを暗号化しましたので
利用したアセットについてお伝えしたいと思います。
セーブデータの改ざんなどがご心配な方の参考になれば幸いです。
更新内容
- 2021/04/29 投稿
- 2021/04/30 メモリ改ざんの通知関数、PlayerPref確認ウィンドウについて追記
利用するアセット「Anti-Cheat Toolkit」
今回紹介するのは「Anti-Cheat Toolkit」というプラグインです。
有料となりますが下記のアセットとなります。

現在も5月までは半額となっているようです。
定期的にセールで安くもなったりするので要チェックです!
暗号化とは
セーブデータって勝手に変更されるとまずいですよね。
例えばゲームで利用しているセーブデータのレベルが「1」→「1000」にされたらまずいですよね。

ヤバいどころではないですね…
そういう時にこういったツールを利用して暗号化しておくことで、不正なセーブデータを検知してセーブデータを作り直したり、ゲーム側の挙動がおかしくならないようにすることができます。
オンラインゲームでは入れておきたい機能
オンラインゲームは白熱しますが、プレイヤー同士で戦いが熱くなるほど
そういった「チートをする人、チーター」などが現れますよね。

熱くなると我を忘れてしまうのかもしれませんね
個人的に楽しむだけならまだしも対戦などで利用されると
攻撃力が強すぎたり、見た目が崩れたり、いろいろ頑張って調整したゲームが台無しになる可能性があります。

私も昔オンラインゲームをしていた時に
チーターだらけのゲームはすぐ冷めた経験があります…
なので出来るだけチーターを避けるための施策を用意する必要があります。
そして今回その改ざんを防ぐためのプラグインとして
「Anti-Cheat Toolkit」を利用していきたいと思います。
プラグイン導入の手順
では手順を順を追ってお伝えしたいと思います。
アセットを購入・インポート
下記のアセットを購入します。
AssetStore画面からインポートのボタンを押すことで
プロジェクトに追加することが可能です。
セーブデータのスクリプトを修正
おそらく多くの方がUnity標準の「PlayerPref」を使って保存しているかと思います。
基本的にはこれを「ObscuredPrefs」というものに変更するだけで
暗号化された状態で読み込んだり、保存したりできます。

簡単!
セーブの移行処理は不要!
「暗号化前と暗号化後の保存データって全部移行しないといけないの?」と思いますよね。

はい、自分も思っていました。
いえ、対応する必要はありません!
私も旧データを取り込んで、暗号化される関数で保存しなおそうとしていたのですが、プラグインの処理を見る限り、データ読み込み時に勝手に変換されて暗号化して保存してくれるようです。

こりゃ便利!
なので対応としては
となります。
セーブデータの改ざんを検知
下記のように「ObscuredPrefs.OnAlterationDetected」に
通知用の関数を設定すれば検知できるようです。
ObscuredPrefs.OnAlterationDetected += SavesAlterationDetected;
※最初の一度しか呼ばれないので注意

これが呼ばれた時に「セーブデータが不正になりました」と
メッセージを出してタイトルに戻せば良さそうですね
保存状態を確認出来るウィンドウ
保存状態を確認出来るウィンドウがあります。
Tools→Code Stage→Anti-Cheat Toolkit→Prefs Editor as Tab…
で専用ウィンドウが開きます。
画面はこんな感じです。
名前は伏せていますが、緑色になっているものが暗号化されているものです。

読み込まれるタイミングで暗号化されるので読み込まれていないものは
まだ暗号化されていないということですね。
「全部暗号化したい!」けど処理が見当たらない
さっきのウィンドウだと一部しか暗号化されていなくて一括で変換したくなりますよね。

なんだか全部できていないと気になりますよね…
ただ残念ながら処理を見つけることができませんでした。
全部のキーデータを取得すること自体面倒な処理らしく標準では実装がないようです。
さっきのウィンドウで変更できるのはあくまでWindowsやMacで処理を書くことで
実現できているように思います。
なので読み込まれた段階で検知していくのが本来の使いなのかなと感じます。
ゲーム側の変数の書き換えも防止する
変数などのメモリ上のものをリアルタイムで書き換えられてしまう
「メモリの改竄」という手段があったりします。
それを防ぐ手立ても用意されています。

さすがっす!
通知関数を設定
手順としては
using CodeStage.AntiCheat.Detectors;
をソースコードの一番上に追加して
ObscuredCheatingDetector.StartDetection(OnObscuredTypeCheatingDetected);
このように通知先の関数を設定します。
変数」書き換え防止の手順
手順としては
using CodeStage.AntiCheat.ObscuredTypes;
をコードの最初に追記します。
通常「int」の変数を作る場合
int testInt = 1;
と書くところを
ObscuredInt testInt = 1;
と書き換えます。

Obscuredをつけるだけですね!
ソースコードを見る限り、他にも様々な型が用意されています。
ObscuredBool
ObscuredByte
ObscuredChar
ObscuredDecimal
ObscuredDouble
ObscuredFloat
ObscuredInt
ObscuredLong
ObscuredQuaternion
ObscuredSByte
ObscuredShort
ObscuredString
ObscuredUInt
ObscuredULong
ObscuredUShort
ObscuredVector2
ObscuredVector2Int
ObscuredVector3
ObscuredVector3Int

これだけあれば大丈夫そうです!
他に知りたい機能があれば
もっと色んな機能があるようなので
インポート時についてきたサンプルフォルダや
Assets/Plugins/CodeStage/AntiCheatToolkit/Examples
下記のマニュアルをご覧ください。

「こんな機能ないかな?」って時は
こちらを確認することをお勧めします!
余談:暗号化は「絶対ではない」ことを理解しておく
暗号化はいわば「鍵」のようなものです。
要するに誰かが必ず開ける必要があるため設計上、開けられる構造にしておく必要があるという矛盾を抱えている技術です。
ただ出来るだけたくさん施策しておく事で「過ちを犯す人が減る」というのは事実です。
せっかくリリースしたゲームが「チーター(違反者)」ばかりだったらゲームが台無しです。
なので出来るだけ抑制するような仕組みを入れておくのは良いことだと思います。

健全なユーザーを手放さないように秩序を守らないとですね!
アプリのPR
このアプリの開発で本記事を書くきっかけとなりました。
終わりに
いかがでしたでしょうか?
プラグインを入れることで暗号化がとても簡単でしたね。

すっごい便利なプラグインでした!
今後もおすすめのアセットや使ってよかったプラグインも紹介していこうと考えているので
ご興味のある方は「左下のベルマーク」でサイトを購読いただけると幸いです。
では今回はここで終わりたいと思います。
ここまでお読みいただきありがとうございました。
コメント