Unityでゲーム開発をしているとき、セーブ機能やサウンド設定などを普通に実装しても、シーン遷移すると状態を保持できません。
シーン遷移するときにオブジェクトの情報を引き継ぐには、「シングルトン」を使う必要があります。
この記事では、Unity初心者の方向けに「シングルトン」の作り方を解説します。
「色々調べたけどシングルトンがよくわからない」という方にも分かるように易しく解説いたしますのでご安心ください。
目次
シングルトンとは
「シーン間でオブジェクトの状態を共有する」とは
シングルトンの実装をしていないゲームオブジェクトは、そのシーンが終了すると破棄されてしまいます。
破棄されたら、同じゲームオブジェクトが再度開始されたとしてもまたStart関数が呼び出されて、スクリプト内の変数やオブジェクトの値も初期化されてしまいます。
シングルトンの実装をしていない例
こちらは、シーン間で全く同じ「シングルトンを実装していないスクリプトをアタッチしたゲームオブジェクト」を置いた状態で遷移して、状態を確認してみた例です。
- 外のシーンと、家の中のシーンそれぞれに「singleton」というスクリプトをアタッチした、「singleton」というゲームオブジェクトを配置しています。
- 外のシーンで、singletonの「Status」というプロパティの値を「100」に変更し、家の中のシーンへ遷移します。
- 家の中のシーンのsingletonの「Status」は「0」に戻っています。
シングルトンを実装した例
こちらは、先ほどの「singleton」スクリプトに、シングルトンのコードを実装した例です。
- 外のシーンと、家の中のシーンそれぞれに「singleton」というスクリプトをアタッチした、「singleton」というゲームオブジェクトを配置しています。
- 外のシーンで、singletonの「Status」というプロパティの値を「100」に変更し、家の中のシーンへ遷移します。
- 家の中のシーンのsingletonの「Status」の値は「100」が保持されています。
シングルトンが必要な場面
上記のようにシーン遷移したあとも、元の値を保持できるゲームオブジェクトが必要な場面はさまざまです。
たとえば下記のようなことを実現したい場合に必要になります。
- タイトル画面でのサウンド設定などを保持したい
- 最初にロードしたセーブデータを使いまわしたい
- どのシーンでも自動セーブ機能を使いたい
- AdMobSDKの初期化をゲーム起動時のみにしたい
シングルトンの実装方法
シングルトンは、まずスクリプトにシングルトン用の記述をしたうえでゲームオブジェクトにアタッチします。
そのゲームオブジェクトをPrefab化して使いまわすことで、どのシーンでも登場させることができるようになります。
C#スクリプトに実装するソースコード
まず、シングルトンにしたいオブジェクトのスクリプトは下記のような記述が必要になります。
// オブジェクトをstatic(静的)にする
public static singleton instance;
// オブジェクトが生成されたとき、
private void Awake()
{
if (instance == null)
{
// シーン遷移しても破棄されないようにする
instance = this;
DontDestroyOnLoad(gameObject);
}
else
{
// 二重で起動されないようにする
Destroy(gameObject);
}
}
- オブジェクトをstatic(静的)にすると、どこからでも値を取得できるようになります。
- DontDestroyOnLoad関数を実行することで、シーン遷移時にも破棄されなくなります。
- Awakeが二回呼び出された場合、オブジェクトが二重に生成されているため破棄します。
ゲームオブジェクトへアタッチする
シングルトンの実装をしたスクリプトを、ゲームオブジェクトへアタッチする。
Prefab化する
シングルトンを実装したスクリプトをアタッチしたゲームオブジェクトをAssetウインドウにドラッグ&ドロップしてPrefab化しましょう。
「Prefab」化すると、同じ内容のオブジェクトをどのシーンでも使いまわすことができます。
また、変更があった場合もPrefab本体を変更することで、すべてに変更が反映されるのでとても便利です。
シングルトンを使う時は、Prefabを利用しましょう。
別のシーンのヒエラルキーに追加
Prefab化したシングルトンのオブジェクトを、使いたい別のシーンへ追加していきましょう。
Prefabをヒエラルキーにドラッグ&ドロップするだけで追加することができます。
まとめ
この記事では下記を説明させていただきました。
- シングルトンが必要となる場面
- シングルトンの動き
- シングルトンの作り方