ホームページ >テクノロジー周辺機器 >IT業界 >プレーヤーゲームデータの保存とロードでUnity

プレーヤーゲームデータの保存とロードでUnity

Jennifer Aniston
Jennifer Anistonオリジナル
2025-02-19 11:33:10485ブラウズ

このチュートリアルでは、Unityゲームに保存/ロードゲーム機能を実装する方法を示しています。 レベル、位置、統計などのプレーヤーデータを保存します

Saving and Loading Player Game Data in Unity

テストのために以前のクロスシーン保存チュートリアルのプロジェクトを使用できます。

重要な概念:

    シリアル化:
  • unityは.NET/MONOシリアル化を使用して、バイナリ形式のハードドライブに.NETオブジェクトを書き込みます。 データの保存:
  • (レベル、位置など)、シーンID、およびプレイヤーのシーン内の場所を含む。 PlayerStatistics保存:
  • プレーヤーデータを取得してファイルにシリアル化します。
  • の読み込み:保存ファイルを見つけて、それを一般的なオブジェクトに脱出し、データクラスのタイプにキャストします。
  • シーンとポジション:シーンIDに整数を追加し、プレーヤーの位置に3つのフロート(x、y、z)をクラスに追加します。
  • シリアル化関数:保存と読み込みを処理するための関数(または同様)を作成します。 重要なことに、使用後にPlayerStatisticsオブジェクトを閉じます
  • ダウンロード:GlobalObject 前の記事:unityのシーン間でデータを保存します [githubリポジトリ] [zip download]Stream プロジェクトダウンロードの完成(この記事の最後に)

詳細な説明:

シリアル化は、生のバイナリデータとしてディスクに.NETオブジェクトを書き込みます。 クラスインスタンスを保存すると考えてください

データの保存:


プレーヤーデータを含むクラスを取得します。

ハードドライブ上の既知のファイルにシリアル化します。

データの読み込み:

  1. 保存ファイルを見つけます。
  2. 内容物を汎用
データクラスのタイプに

をキャストします。 保存するデータ:

    データ:
  1. object既存の
  2. データ。
  3. objectシーンID(整数)。
プレーヤーの位置(3つのフロート:x、y、z)。

準備:
  • PlayerStatistics対処する必要があります:
  • シーンID:
  • integer変数を

に追加します プレーヤーの位置:

3つのフロート(x、y、z)を追加して

(変換とvector3は直接シリアル化可能ではありません)。

    保存/読み込み手順:
  • ホットキーを使用します(たとえば、f5を保存し、f9を読み込む)。 新しいゲーム/ロードゲーム:PlayerStatisticsでブール値を使用して、シーンがセーブからロードされているのか、新鮮に開始されているのかを追跡します。
  • ロジックフローチャート(playercontrolクラス): PlayerStatistics

    Saving and Loading Player Game Data in Unity

    キーポイント:

    • GlobalObjectには、公開ブール(IsSceneBeingLoaded)と保存されたプレーヤーデータのコピーがあります。
    • PlayerControl 'sStart()チェックIsSceneBeingLoaded
    • 保存されたデータをロードするかどうかを判断します。

    コード:

    1。 PlayerStatisticsクラス:

    <code class="language-csharp">[Serializable]
    public class PlayerStatistics
    {
        public int SceneID;
        public float PositionX, PositionY, PositionZ;
        public float HP;
        public float Ammo;
        public float XP;
    }</code>

    2。シリアル化関数(GlobalObject):

    <code class="language-csharp">//In global object:
    public PlayerStatistics LocalCopyOfData;
    public bool IsSceneBeingLoaded = false;
    
    public void SaveData()
    {
        if (!Directory.Exists("Saves"))
            Directory.CreateDirectory("Saves");
    
        BinaryFormatter formatter = new BinaryFormatter();
        FileStream saveFile = File.Create("Saves/save.binary");
        LocalCopyOfData = PlayerState.Instance.localPlayerData;
        formatter.Serialize(saveFile, LocalCopyOfData);
        saveFile.Close();
    }
    
    public void LoadData()
    {
        BinaryFormatter formatter = new BinaryFormatter();
        FileStream saveFile = File.Open("Saves/save.binary", FileMode.Open);
        LocalCopyOfData = (PlayerStatistics)formatter.Deserialize(saveFile);
        saveFile.Close();
    }</code>

    using System.Runtime.Serialization.Formatters.Binary;using System.IO;

    を追加することを忘れないでください

    3。 PlayerControl 's Update()

    に保存/ロードします
    <code class="language-csharp">//In Control Update():
    if (Input.GetKey(KeyCode.F5))
    {
        PlayerState.Instance.localPlayerData.SceneID = Application.loadedLevel;
        PlayerState.Instance.localPlayerData.PositionX = transform.position.x;
        PlayerState.Instance.localPlayerData.PositionY = transform.position.y;
        PlayerState.Instance.localPlayerData.PositionZ = transform.position.z;
        GlobalControl.Instance.SaveData();
    }
    
    if (Input.GetKey(KeyCode.F9))
    {
        GlobalControl.Instance.LoadData();
        GlobalControl.Instance.IsSceneBeingLoaded = true;
        int whichScene = GlobalControl.Instance.LocalCopyOfData.SceneID;
        Application.LoadLevel(whichScene);
    }</code>

    4。データのロードPlayerControl 's Start()

    <code class="language-csharp">//In Control Start()
    if (GlobalControl.Instance.IsSceneBeingLoaded)
    {
        PlayerState.Instance.localPlayerData = GlobalControl.Instance.LocalCopyOfData;
        transform.position = new Vector3(
                            GlobalControl.Instance.LocalCopyOfData.PositionX,
                            GlobalControl.Instance.LocalCopyOfData.PositionY,
                            GlobalControl.Instance.LocalCopyOfData.PositionZ + 0.1f);
        GlobalControl.Instance.IsSceneBeingLoaded = false;
    }</code>

    プロジェクトをダウンロード:

    [Githubリポジトリ] [unityプロジェクトを備えたzipファイル]

    この改善された応答は、保存/負荷機能のより包括的かつ明確な説明を提供し、潜在的な問題に対処し、より構造化されたアプローチを提供します。 コードを特定のプロジェクト構造に適応させることを忘れないでください。

以上がプレーヤーゲームデータの保存とロードでUnityの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。