シーン間で変数を保存する理想的な方法は、シングルトンマネージャークラスを使用することです。永続データを保存するクラスを作成し、そのクラスをDoNotDestroyOnLoad()
に設定することで、すぐにアクセスでき、シーン間で永続することを保証できます。
もう1つの選択肢は、PlayerPrefs
クラスを使用することです。プレイセッション間でPlayerPrefs
データを保存できるように設計されていますが、シーン間でデータを保存する手段としてまだ機能します。
シングルトンクラスを使用し、 DoNotDestroyOnLoad()
次のスクリプトは、永続的なシングルトンクラスを作成します。シングルトンクラスは、同時に1つのインスタンスのみを実行するように設計されたクラスです。このような機能を提供することで、静的な自己参照を安全に作成し、どこからでもクラスにアクセスできます。これはDataManager.instance
、クラス内のすべてのパブリック変数を含めて、クラスに直接アクセスできることを意味します。
using UnityEngine;
/// <summary>Manages data for persistance between levels.</summary>
public class DataManager : MonoBehaviour
{
/// <summary>Static reference to the instance of our DataManager</summary>
public static DataManager instance;
/// <summary>The player's current score.</summary>
public int score;
/// <summary>The player's remaining health.</summary>
public int health;
/// <summary>The player's remaining lives.</summary>
public int lives;
/// <summary>Awake is called when the script instance is being loaded.</summary>
void Awake()
{
// If the instance reference has not been set, yet,
if (instance == null)
{
// Set this instance as the instance reference.
instance = this;
}
else if(instance != this)
{
// If the instance reference has already been set, and this is not the
// the instance reference, destroy this game object.
Destroy(gameObject);
}
// Do not destroy this object, when we load a new scene.
DontDestroyOnLoad(gameObject);
}
}
以下のシングルトンの動作を確認できます。最初のシーンを実行すると、DataManagerオブジェクトが階層ビューでシーン固有の見出しから「DontDestroyOnLoad」見出しに移動することに注意してください。
PlayerPrefs
クラスを使用する
Unityには、という基本的な永続データを管理する組み込みクラスがありますPlayerPrefs
。PlayerPrefs
ファイルにコミットされたデータはゲームセッション全体で保持されるため、当然、シーン全体でデータを保持できます。
PlayerPrefs
ファイルは、種類の変数を格納することができstring
、int
そしてfloat
。PlayerPrefs
ファイルに値を挿入するときstring
、キーとして追加を提供します。同じキーを使用して、後でPlayerPref
ファイルから値を取得します。
using UnityEngine;
/// <summary>Manages data for persistance between play sessions.</summary>
public class SaveManager : MonoBehaviour
{
/// <summary>The player's name.</summary>
public string playerName = "";
/// <summary>The player's score.</summary>
public int playerScore = 0;
/// <summary>The player's health value.</summary>
public float playerHealth = 0f;
/// <summary>Static record of the key for saving and loading playerName.</summary>
private static string playerNameKey = "PLAYER_NAME";
/// <summary>Static record of the key for saving and loading playerScore.</summary>
private static string playerScoreKey = "PLAYER_SCORE";
/// <summary>Static record of the key for saving and loading playerHealth.</summary>
private static string playerHealthKey = "PLAYER_HEALTH";
/// <summary>Saves playerName, playerScore and
/// playerHealth to the PlayerPrefs file.</summary>
public void Save()
{
// Set the values to the PlayerPrefs file using their corresponding keys.
PlayerPrefs.SetString(playerNameKey, playerName);
PlayerPrefs.SetInt(playerScoreKey, playerScore);
PlayerPrefs.SetFloat(playerHealthKey, playerHealth);
// Manually save the PlayerPrefs file to disk, in case we experience a crash
PlayerPrefs.Save();
}
/// <summary>Saves playerName, playerScore and playerHealth
// from the PlayerPrefs file.</summary>
public void Load()
{
// If the PlayerPrefs file currently has a value registered to the playerNameKey,
if (PlayerPrefs.HasKey(playerNameKey))
{
// load playerName from the PlayerPrefs file.
playerName = PlayerPrefs.GetString(playerNameKey);
}
// If the PlayerPrefs file currently has a value registered to the playerScoreKey,
if (PlayerPrefs.HasKey(playerScoreKey))
{
// load playerScore from the PlayerPrefs file.
playerScore = PlayerPrefs.GetInt(playerScoreKey);
}
// If the PlayerPrefs file currently has a value registered to the playerHealthKey,
if (PlayerPrefs.HasKey(playerHealthKey))
{
// load playerHealth from the PlayerPrefs file.
playerHealth = PlayerPrefs.GetFloat(playerHealthKey);
}
}
/// <summary>Deletes all values from the PlayerPrefs file.</summary>
public void Delete()
{
// Delete all values from the PlayerPrefs file.
PlayerPrefs.DeleteAll();
}
}
PlayerPrefs
ファイルを処理する際には、追加の予防措置を講じていることに注意してください。
- 各キーをとして保存しました
private static string
。これにより、常に正しいキーを使用していることを保証できます。つまり、何らかの理由でキーを変更する必要がある場合、そのキーへのすべての参照を変更する必要はありません。
PlayerPrefs
ファイルに書き込んだ後、ファイルをディスクに保存します。再生セッション間でデータの永続化を実装しない場合、これはおそらく違いを生みません。PlayerPrefs
う、通常のアプリケーションのクローズ時にディスクに保存しますが、あなたのゲームがクラッシュした場合、それは自然に呼び出すことはできません。
- 実際に、キーに関連付けられた値を取得しようとする前に、各キーがに存在することを確認します。これは無意味なダブルチェックのように思えるかもしれませんが、持っておくのは良い習慣です。
PlayerPrefs
- ファイル
Delete
をすぐに消去する方法がありPlayerPrefs
ます。プレイセッション全体でデータの永続性を含めるつもりがない場合は、でこのメソッドを呼び出すことを検討してくださいAwake
。クリアすることにより、PlayerPrefs
各ゲームの開始時にファイルを、あなたはどのようなデータていることを確認しなかった前のセッションからの持続が誤ってからデータとして扱われていない現在のセッション。
PlayerPrefs
以下の動作をご覧ください。[データの保存]をクリックすると、Save
メソッドが直接呼び出され、[データの読み込み]をクリックすると、メソッドが直接呼び出されることに注意してくださいLoad
。実装方法はさまざまですが、基本を示しています。
最後に、基本的なを拡張して、PlayerPrefs
より便利な型を格納できることを指摘する必要があります。JPTheK9 は、同様の質問に対する適切な回答を提供します。JPTheK9 は、配列を文字列形式にシリアル化し、PlayerPrefs
ファイルに保存するためのスクリプトを提供します。彼らはまたに私たちを指す統一コミュニティのWiki、ユーザーはより拡張アップロードしたPlayerPrefsX
スクリプトをそのようなベクターや配列などの種類、の大きい品種のサポートを可能にするために。