■ 简介
游戏必备保存数据让我们做! !
这次以分数排名为例。保存和加载数据我们将实施处理
(我写这个作为个人备忘录。可能有更有效的方法,但请理解。)
■ 实施结果
你可以做这样的事情。即使您结束游戏一次,也会根据保存的数据显示排名。
我也上传到了GitHub,大家看看↓
■ 说明
○ 你需要什么
- 要保存的数据类
- 保存或加载处理类
-
显示排名,保存排名值一个处理类似事情的类
- 只能创建 3 个类。代码量不是很多,但可能有点复杂。
・这次以排名为例。它可用于保存高分和游戏保存数据。○ 做
● 存储数据类
- 声明要存储的变量
- 类序列化
● 保存负载等级
- 获取文件路径
- 启动时,检查文件是否存在
- 如果文件不存在则创建文件
- 如果文件存在,读取并存储在“保存数据类”类型变量中
-
完成后保存数据
● 排名类
- 从“保存加载类”中引用“保存数据类”类型的变量
- 获取要在排行榜中显示的文本对象和组件
- 始终显示排名
- 在输入栏输入数字后,按回车键替换排名中的数字并保存数字
-
按删除按钮删除排名中的数值
■ 代码
① 保存数据类(SaveData)
保存数据.cs[System.Serializable] public class SaveData { public const int rankCnt = 3; public int[] rank = new int[rankCnt]; }- 它应该用
[System.Serializable]序列化。 -
您声明的任何成员变量都必须以
public为前缀。
② 保存加载类(DataManager)
数据管理器.csusing 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)
排名.csusing 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
○ 做
-
将“DataManager”和“Ranking”添加到空对象(Manager)做
-
将 InputField 的“InputField”组件中的“Content Type”更改为“Integer Number”以将输入限制为仅整数
-
将Manager的“Ranking”脚本的公共函数放在Enter、Delete按钮的“OnClick()”中
■终于
- 如果你不加密重要数据,你可以很容易地重写它,所以我会尽快研究。
- 我还没有能够在实际游戏中使用这样的系统,所以我会继续尝试。
■ 参考
- 它应该用
原创声明:本文系作者授权爱码网发表,未经许可,不得转载;
原文地址:https://www.likecs.com/show-308627123.html