■ 简介

游戏必备保存数据让我们做! !
这次以分数排名为例。保存和加载数据我们将实施处理

(我写这个作为个人备忘录。可能有更有效的方法,但请理解。)

■ 实施结果

你可以做这样的事情。即使您结束游戏一次,也会根据保存的数据显示排名。
【Unity】 jsonファイルを使ったセーブとロード

我也上传到了GitHub,大家看看↓

■ 说明

○ 你需要什么

  1. 要保存的数据
  2. 保存或加载处理类
  3. 显示排名,保存排名值一个处理类似事情的类

    - 只能创建 3 个类。代码量不是很多,但可能有点复杂。
    ・这次以排名为例。它可用于保存高分和游戏保存数据。

    ○ 做

    ● 存储数据类

    1. 声明要存储的变量
    2. 类序列化

      ● 保存负载等级

      1. 获取文件路径
      2. 启动时,检查文件是否存在
      3. 如果文件不存在则创建文件
      4. 如果文件存在,读取并存储在“保存数据类”类型变量中
      5. 完成后保存数据

        ● 排名类

        1. 从“保存加载类”中引用“保存数据类”类型的变量
        2. 获取要在排行榜中显示的文本对象和组件
        3. 始终显示排名
        4. 在输入栏输入数字后,按回车键替换排名中的数字并保存数字
        5. 按删除按钮删除排名中的数值

          ■ 代码

          ① 保存数据类(SaveData)

          保存数据.cs
          [System.Serializable]
          public class SaveData {
              public const int rankCnt = 3;
              public int[] rank = new int[rankCnt];
          }
          
          • 它应该用[System.Serializable] 序列化。
          • 您声明的任何成员变量都必须以public 为前缀。

          ② 保存加载类(DataManager)

          数据管理器.cs
          using System.IO;
          using UnityEngine;
          
          public class DataManager : MonoBehaviour 
          {
              [HideInInspector] public SaveData data;     // json変換するデータのクラス
              string filepath;                            // jsonファイルのパス
              string fileName = "Data.json";              // jsonファイル名
          
              //-------------------------------------------------------------------
              // 開始時にファイルチェック、読み込み
              void Awake()
              {
                  // パス名取得
                  filepath = Application.dataPath + "/" + fileName;       
          
                  // ファイルがないとき、ファイル作成
                  if (!File.Exists(filepath)) {
                      Save(data);
                  }
          
                  // ファイルを読み込んでdataに格納
                  data = Load(filepath);          
              }
          
              //-------------------------------------------------------------------
              // jsonとしてデータを保存
              void Save(SaveData data)
              {
                  string json = JsonUtility.ToJson(data);                 // jsonとして変換
                  StreamWriter wr = new StreamWriter(filepath, false);    // ファイル書き込み指定
                  wr.WriteLine(json);                                     // json変換した情報を書き込み
                  wr.Close();                                             // ファイル閉じる
              }
          
              // jsonファイル読み込み
              SaveData Load(string path)
              {
                  StreamReader rd = new StreamReader(path);               // ファイル読み込み指定
                  string json = rd.ReadToEnd();                           // ファイル内容全て読み込む
                  rd.Close();                                             // ファイル閉じる
                                                                          
                  return JsonUtility.FromJson<SaveData>(json);            // jsonファイルを型に戻して返す
              }
          
              //-------------------------------------------------------------------
              // ゲーム終了時に保存
              void OnDestroy()
              {
                  Save(data);
              }
          }
          
          • 写入和读取文件需要using System.IO;将会

          苏醒()

          对应代码(点击展开)
              // 開始時にファイルチェック、読み込み
              void Awake()
              {
                  // パス名取得
                  filepath = Application.dataPath + "/" + fileName;       
          
                  // ファイルがないとき、ファイル作成
                  if (!File.Exists(filepath)) {
                      Save(data);
                  }
          
                  // ファイルを読み込んでdataに格納
                  data = Load(filepath);          
              }
          
          • filepath = Application.dataPath + "/" + fileName;获取文件路径名去做。
            • Application.dataPath 有不同的路径,具体取决于平台。 (细节)
          • if (!File.Exists(filepath))检查数据文件是否存在去做。
          • 如果文件不存在,用Save(data);创建一个文件去做。
          • 使用data = Load(filepath); 读取文件增加。

          参考


          保存(保存数据数据)

          对应代码(点击展开)
              // jsonとしてデータを保存
              void Save(SaveData data)
              {
                  string json = JsonUtility.ToJson(data);                 // jsonとして変換
                  StreamWriter wr = new StreamWriter(filepath, false);    // ファイル書き込み指定
                  wr.WriteLine(json);                                     // json変換した情報を書き込み
                  wr.Close();                                             // ファイル閉じる
              }
          
          • 参数数据是SaveData 类型数据保存收到。
          • JsonUtility.ToJson(data); 从 SaveData 类型转换为 json(字符串类型)。
          • StreamWriter wr = new StreamWriter(filepath, false);指定覆盖。
          • wr.WriteLine(json);将 SaveData 中的变量写入文件。

          参考

          加载(字符串路径)

          对应代码(点击展开)
              // jsonファイル読み込み
              SaveData Load(string path)
              {
                  StreamReader rd = new StreamReader(path);               // ファイル読み込み指定
                  string json = rd.ReadToEnd();                           // ファイル内容全て読み込む
                  rd.Close();                                             // ファイル閉じる
                                                                          
                  return JsonUtility.FromJson<SaveData>(json);            // jsonファイルを型に戻して返す
              }
          
          • 参数路径是要读取的json文件路径收到。
          • return JsonUtility.FromJson<SaveData>(json);从 json 文件转换为 SaveData 类型并返回。

          参考


          OnDestroy()

          对应代码(点击展开)
              // ゲーム終了時に保存
              void OnDestroy()
              {
                  Save(data);
              }
          
          • 游戏结束时文件被保存。

          ③ 排名班(Ranking)

          排名.cs
          using UnityEngine;
          using UnityEngine.UI;
          
          public class Ranking : MonoBehaviour
          {
              /* 値 */
              string[]    rankNames = { "1st", "2nd", "3rd" };        // ランキング名
              const int   rankCnt = SaveData.rankCnt;                 // ランキング数
          
              /* コンポーネント取得用 */
              Text[]      rankTexts = new Text[rankCnt];              // ランキングのテキスト
              SaveData    data;                                       // 参照するセーブデータ
          
              //-------------------------------------------------------------------
              void Start()
              {
                  data = GetComponent<DataManager>().data;            // セーブデータをDataManagerから参照
          
                  for (int i = 0; i < rankCnt; i++) {
                      Transform rankChilds = GameObject.Find("RankTexts").transform.GetChild(i);      // 子オブジェクト取得
                      rankTexts[i] = rankChilds.GetComponent<Text>();                                 // 子オブジェクトのコンポーネント取得
                  }
              }
          
              //-------------------------------------------------------------------
              void FixedUpdate()
              {
                  DispRank();
              }
          
              // ランキング表示
              void DispRank()
              {
                  for (int i = 0; i < rankCnt; i++) {
                      rankTexts[i].text = (rankNames[i] + " : " + data.rank[i]);
                  }
              }
          
              // ランキング保存
              public void SetRank()
              {
                  InputField inpFld = GameObject.Find("InputField").GetComponent<InputField>();
                  int score = int.Parse(inpFld.text);     // string -> int
          
                  // スコアがランキング内の値よりも大きいときは入れ替え
                  for (int i = 0; i < rankCnt; i++) {
                      if (score > data.rank[i]) {
                          var rep = data.rank[i];
                          data.rank[i] = score;
                          score = rep;
                      }
                  }
              }
          
              // ランクデータの削除
              public void DelRank()
              {
                  for (int i = 0; i < rankCnt; i++) {
                      data.rank[i] = 0;
                  }
              }
          }
          
          
          • 由于我们使用 Text、InputField 等。using UnityEngine.UI; 必填将会
          • 排名元素个数rankCnt来自 SaveData 类的引用正在做。
          • 您必须在 DataManager 类中唤醒,然后启动 Ranking 类。

          开始()

          对应代码(点击展开)
              void Start()
              {
                  data = GetComponent<DataManager>().data;            // セーブデータをDataManagerから参照
          
                  for (int i = 0; i < rankCnt; i++) {
                      Transform rankChilds = GameObject.Find("RankTexts").transform.GetChild(i);      // 子オブジェクト取得
                      rankTexts[i] = rankChilds.GetComponent<Text>();                                 // 子オブジェクトのコンポーネント取得
                  }
              }
          
          • 从 DataManager 引用数据正在做。
          • 在 for 语句中获取排名文本对象和组件正在做。

          DispRank()

          对应代码(点击展开)
              // ランキング表示
              void DispRank()
              {
                  for (int i = 0; i < rankCnt; i++) {
                      rankTexts[i].text = (rankNames[i] + " : " + data.rank[i]);
                  }
              }
          
          • 更改 for 语句中的排名文本。
          • 一直在 FixedUpdate 中运行。

          设置排名()

          对应代码(点击展开)
              // ランキング保存
              public void SetRank()
              {
                  InputField inpFld = GameObject.Find("InputField").GetComponent<InputField>();
                  int score = int.Parse(inpFld.text);     // string -> int
          
                  // スコアがランキング内の値よりも大きいときは入れ替え
                  for (int i = 0; i < rankCnt; i++) {
                      if (score > data.rank[i]) {
                          var rep = data.rank[i];
                          data.rank[i] = score;
                          score = rep;
                      }
                  }
              }
          
          • 获取int.Parse(inpFld.text)InputField中输入的值去做。
          • 在 for 语句中,对输入值和排名中的值进行判断和替换。

          德尔兰克()

          对应代码(点击展开)
              // ランクデータの削除
              public void DelRank()
              {
                  for (int i = 0; i < rankCnt; i++) {
                      data.rank[i] = 0;
                  }
              }
          
          • 所有数据值都设置为0。

          ■统一操作

          ○ 需要的东西

          • 空对象(管理器)
          • 帆布
            • 输入字段
            • 进入按钮
            • 删除按钮
            • 排名显示文本 x 3

          【Unity】 jsonファイルを使ったセーブとロード

          ○ 做

          • 将“DataManager”和“Ranking”添加到空对象(Manager)
            【Unity】 jsonファイルを使ったセーブとロード

          • 将 InputField 的“InputField”组件中的“Content Type”更改为“Integer Number”以将输入限制为仅整数
            【Unity】 jsonファイルを使ったセーブとロード

          • 将Manager的“Ranking”脚本的公共函数放在Enter、Delete按钮的“OnClick()”中
            【Unity】 jsonファイルを使ったセーブとロード

          ■终于

          • 如果你不加密重要数据,你可以很容易地重写它,所以我会尽快研究。
          • 我还没有能够在实际游戏中使用这样的系统,所以我会继续尝试。

          ■ 参考


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308627123.html

相关文章: