CGBoxの一部の記事にはアフィリエイト広告が含まれております。
【Unity】PlayerPrefsでセーブ機能を実装する
![](https://cgbox.jp/wp-content/uploads/2023/08/3967c99bc6cf180870cb67fbcb3150d7.jpg)
ゲーム開発が進んでくると、セーブ機能が欲しくなってくると思います。
スコアを保存したり、ゲーム設定を保存したりと、本格的なゲームにはセーブ機能が不可欠ですよね。
Unityでは、PlayerPrefsを使ってセーブ機能を簡単に実装することができます!
そこで本記事では、PlayerPrefsを使ったセーブ機能の実装方法や、セーブができるアセットなどを紹介していきます。
PlayerPrefsとは
PlayerPrefsとは、Unityで提供されているゲームデータのセーブ・ロードができる機能です。
下のようにスコアを保存して表示させたり、プレーヤー名といった簡易なデータの保存に向いています。
![](https://cgbox.jp/wp-content/uploads/2023/08/25575002f3611b63ed1fec6cadf95f77.png)
特に準備するものはなく、簡単なコードで利用できます。
端末内にデータを保存するので、サーバーが必要ないというメリットがありますが
その反面ユーザーから簡単にアクセスされるといったデメリットもあります。
PlayerPrefsの使い方
ここでは、PlayerPrefsを実際に使う方法について以下のような順番で解説していきます。
- データをセーブする
- データをロードする
- データが存在するかチェック
- データを削除する
それでは順番に解説していきます。
データをセーブする
PlayerPrefsで保存できるデータ型は、Int(整数)float(浮動小数点)string(文字列)の3種類です。
3つのデータ型を取得するには、下のようなコードを使います。
//キー名「Score」にint型で100の値を保存。
PlayerPrefs.SetInt("Score", 100);
//キー名「Hp」にfloat型で10.0fの値を保存
PlayerPrefs.SetFloat("Hp", 10.0f);
//キー名「PlayerName」にstring型でhogeという値を保存
PlayerPrefs.SetString("PlayerName", "hoge");
// 最後にSaveメソッドを実行して保存する
PlayerPrefs.Save();
手順としては、まずはSet〇〇でキー名と値をペアとしてセットします。
この時点ではまだ値は保存されていません。
その後Saveメソッドを実行すると、データが保存されます。
データをロードする
セーブしたデータをロードするには、下のようなコードを使います。
// キー名「Score」の値をロードする。データが存在しない場合「5」を返します。
var score = PlayerPrefs.GetInt("Score", 5);
// キー名「Hp」の値をロードする。データが存在しない場合「10.0f」を返します。
var hp = PlayerPrefs.GetFloat("Hp", 10.0f);
// キー名「PlayerName」の値をロードする。データが存在しない場合「hoge」を返します。
var name = PlayerPrefs.GetString("PlayerName", "hoge");
上のように、GetInt、GetFloat、GetStringのいずれかを用い、キー名を指定することでデータをロードできます。
キー名の後で指定しているのは、データが存在しなかった場合のデフォルト値です。
デフォルト値を指定しておくことで、まだセーブされていないデータでも値を表示できます。
データをセーブする前に値をロードすると、下のようにデフォルト値が返されます。
![](https://cgbox.jp/wp-content/uploads/2023/08/4329a14e88586d611fe53a9403a48b25.png)
このデフォルト値は省略して書くこともできます。
PlayerPrefs.GetInt("Score");
PlayerPrefs.GetFloat("Hp");
PlayerPrefs.GetString("PlayerName");
その場合、データが存在しなかった時は下のような値が返ってきます。
![](https://cgbox.jp/wp-content/uploads/2023/08/a4f2a6335630c5435f12eeddaf7f21f4.png)
データが存在するかチェック
セーブデータが存在するかどうかチェックできるメソッドも用意されています。
HasKey(キー名)でそのキーのセーブデータが存在するかをチェックできます。
下のような使用例で使えます。
if (PlayrePrefs.HasKey("PlayerName") == true)
{
//プレーヤーネームのデータが存在する場合の処理
}
else
{
//プレーヤーネームのデータが存在しない場合の処理
}
このようにセーブデータが存在するかどうかで処理を分けることができます。
データを削除する
セーブデータを削除するメソッドは、以下の2種類あります。
// Scoreというキー名のデータのみを削除
PlayerPrefs.DeleteKey("Score");
// 保存されているすべてのセーブデータを削除
PlayerPrefs.DeleteAll();
PlayerPrefsを使わずにセーブ機能を実装する方法
ここまでPlayerPrefsのセーブ機能を紹介してきました。
PlayerPrefsは機能がシンプルで使いやすいのですが、以下のようなデメリットもあります。
- 保存できるデータ型が少ない(int,float,stringのみ)
- 大量のデータを保存するのは大変
- 暗号化されずユーザーからアクセスしやすい。
なので、もっとセーブ機能にこだわりたい場合、別の方法でセーブ機能を実装することもできます。
JSON 形式で保存する
JSON 形式でセーブデータをファイルに保存し、セーブデータとして扱う方法があります。
こちらの方がPlayerPrefsよりも、たくさんのデータを保存するのに適しています。
JSON 形式のセーブ機能の実装については、下の記事で詳しくまとめられているので、ご参照ください。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-412672c5f0600ab9a64263b751f1bc81.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9JUUzJTgwJTkwVW5pdHklRTMlODAlOTElMjBqc29uJUUzJTgzJTk1JUUzJTgyJUExJUUzJTgyJUE0JUUzJTgzJUFCJUUzJTgyJTkyJUU0JUJEJUJGJUUzJTgxJUEzJUUzJTgxJTlGJUUzJTgyJUJCJUUzJTgzJUJDJUUzJTgzJTk2JUUzJTgxJUE4JUUzJTgzJUFEJUUzJTgzJUJDJUUzJTgzJTg5JnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnR4dC1jb2xvcj0lMjMyMTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9NTYmcz0xYTI4NWVmMjQzZDBjNTcwMmQyOTA3YTNjNDIwMjUwYQ&mark-x=142&mark-y=57&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9NzcwJnR4dD0lNDBraWt1MDkwMjAmdHh0LWNvbG9yPSUyMzIxMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT0zNiZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZzPTRjZjhmOGQwNmZmZDBiN2UwMzcyOWYwZTQ1MjM5NmYz&blend-x=142&blend-y=486&blend-mode=normal&s=f5265c39e6d02681481b2a1c516ee5de)
アセットを使う
AssetStoreでは有料・無料のセーブ用アセットが発売されています。
セーブ用のアセットを使えば、先ほど紹介したPlayerPrefsのデメリットを補えます。
PlayerPrefsよりも非常に多くの型のセーブに対応していたり、
暗号化を簡単に行えたりと、いいことづくめなのでアセットでのセーブも試してみましょう!
ここからはセーブ機能がついたアセットを2つ紹介していきます。
セーブ機能を実装するアセット紹介
Easy Save – The Complete Save Data & Serializer System
![](https://assetstorev1-prd-cdn.unity3d.com/key-image/84fa362a-5d5a-4cb6-b56d-d38bd7fc3f1a.jpg?v=1)
セーブ機能といえばこのアセット!というくらい有名で便利な有料アセットです。
多くの型の保存に対応しており、配列やゲームオブジェクトをそのままセーブすることができます。
また、セーブデータの暗号化も設定一つで行うことができます。
利用者が多く、設定で困っても検索すれば日本語の情報が出てくるのも嬉しいポイントです。
Quick Save
![](https://cgbox.jp/wp-content/uploads/2023/08/3c4ce983e00ce91d500dc5a2d9e1504f.png)
![](https://assetstorev1-prd-cdn.unity3d.com/key-image/7857815e-d8fb-4d14-af6f-1340b68d6490.jpg?v=1)
こちらは無料でセーブ機能が使えるアセットです。
Vector3やSprite型のセーブにも対応しています。
ただセーブデータの暗号化にはコードを書く必要があり、
そこは有料アセットのQuick Saveの方が視覚的に設定できる分便利です。
ですが無料であることを考えれば十分なクオリティのセーブアセットです。
まとめ
- PlayerPrefsでデータのセーブ・ロード・削除が簡単にできる
- JSON形式でファイルにデータを保存する方法もある。
- アセットを使うとPlayerPrefsで足りない部分を補える
以上、PlayerPrefsでセーブ機能を実装する方法から、セーブアセットまで紹介してきました。
セーブデータが少しのゲームならPlayerPrefsでもゲーム開発はできますが
データ量が多いゲームならアセットを使った方が効率的に開発できそうですね!