首先寫一個腳本 GameData在內寫數據的模板 ,因爲數據不止一條 因此要寫一個list來存這些模板
[Serialization]
//這是自己定義的模板
public class GameData{
public string PeopleName;
public List<Vector3> pos;
}
//這裏是很多條模板
public class GameDatas
{
public List<GameData> dataList;
}
然後我們寫一個腳本來記錄數據的存儲
首先
//數據的寫入
void WriteData(GameDatas data)
{
StreamWriter sw = new StreamWriter("C:/Users/37864/Desktop/1.json", false, Encoding.UTF8);
string json = JsonUtility.ToJson(data);
sw.WriteLine(json);
sw.Close();//關閉
sw.Dispose();//銷燬流
}
//數據的讀取
GameDatas ToReadData()
{
StreamReader sr = new StreamReader("C:/Users/37864/Desktop/1.json", Encoding.UTF8);
string datas = sr.ReadToEnd();
GameDatas team = new GameDatas();
team = JsonUtility.FromJson<GameDatas>(datas);
sr.Close();
return team;
}
剩下的就是邏輯的事情,首先我們要實現的功能是打地鼠編輯功能就是說可以出地鼠的幾個洞我們希望可以選擇而且希望選擇完之後可以將洞的座標保存下來,和輸入的名字一樣存爲一條數據也就是我們的模板那樣的數據,而且我們當第二個人玩的時候可以存第二條數據,且和第一條數據一起保存在本地。
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;
using UnityEngine;
using UnityEngine.UI;
public class GameEditor : MonoBehaviour {
//這裏是我們的UI聲明
public List<Button> bts;//如果沒有底下的find我們就需要把他找出來
private Button writeButton;
private InputField _nameField;
//這裏是存儲數據聲明
//我們首先new一個類對象來存放數據
GameDatas datas = new GameDatas();
//new一個集合來存放很多模板
List<GameData> s = new List<GameData>();
//new一個類對象來存放新的模板
GameData gameData = new GameData();
//new一個集合來存放pos的位置
List<Vector3> points = new List<Vector3>();
//new一個類對象來存放讀取到的數據
GameDatas readData = new GameDatas();
void Awake()
{
//第一次--普通寫入
//我們new一個集合來表示許多的Button,因爲我們的Button只在Awake裏面用到了因此就只需要在這裏進行變量聲明
List<Button> bts = new List<Button>();
//然後依次把Button在列表中find出來
for (int i = 0; i < 8; i++)
{
string buttonName = "/Canvas/bt" + i;
bts.Add(GameObject.Find(buttonName).GetComponent<Button>());
}
writeButton = GameObject.Find("/Canvas/write").GetComponent<Button>();
//這是許多的按鈕的監聽事件
bts[0].onClick.AddListener(delegate { ButtonClick(bts[0]); });
bts[1].onClick.AddListener(delegate { ButtonClick(bts[1]); });
bts[2].onClick.AddListener(delegate { ButtonClick(bts[2]); });
bts[3].onClick.AddListener(delegate { ButtonClick(bts[3]); });
bts[4].onClick.AddListener(delegate { ButtonClick(bts[4]); });
bts[5].onClick.AddListener(delegate { ButtonClick(bts[5]); });
bts[6].onClick.AddListener(delegate { ButtonClick(bts[6]); });
bts[7].onClick.AddListener(delegate { ButtonClick(bts[7]); });
//我們先把數據保存下來,然後當點擊writeButton的時候一齊把數據寫入
writeButton.onClick.AddListener(() => {
//首先判斷文件是否存在
bool inspect = File.Exists("C:/Users/37864/Desktop/1.json");
if (inspect)
{
Debug.Log("擁有文件,讀取數據");
GameDatas readDatas = ToReadData();
if(readDatas != null) //有數據
{
gameData.pos = points;
readDatas.dataList.Add(gameData);
WriteData(readDatas);
}
}
else /否則就是第一次寫入
{
gameData.pos = points;
s.Add(gameData);
datas.dataList = s;
//datas1=readData;
//WriteData(datas1);
WriteData(datas);
}
});
});
_nameField = GameObject.Find("/Canvas/NameInputField").GetComponent<InputField>();
_nameField.onEndEdit.AddListener(delegate { NameEnd(); });
_nameField.contentType = InputField.ContentType.Name;
//------------------------------------------------------------------------------
//② 寫入(不讀取,直接寫入)
//先打開文件,在末尾添加","
//寫入第一次數據(在數據末尾添加,而不是覆蓋)
//讀取
//先看看是否文件存在
//存在
//判斷數據是否爲空
//爲null
//文件損壞,return,不執行任何操作
//不爲null
//讀取到人物數據,創建人物信息
//不存在
//return,不執行任何操作
}
//按鈕點擊執行的方法
void ButtonClick(Button bt)
{
points.Add(GetPosition(bt));
}
//輸入框結束之後執行的方法
private void NameEnd()
{
string _name = _nameField.text;
gameData.PeopleName = _name;
}
//寫入數據
void WriteData(GameDatas data)
{
StreamWriter sw = new StreamWriter("C:/Users/37864/Desktop/1.json", false, Encoding.UTF8);
string json = JsonUtility.ToJson(data);
sw.WriteLine(json);
sw.Close();//關閉
sw.Dispose();//銷燬流
}
//讀取數據
GameDatas ToReadData()
{
StreamReader sr = new StreamReader("C:/Users/37864/Desktop/1.json", Encoding.UTF8);
string datas = sr.ReadToEnd();
GameDatas team = new GameDatas();
team = JsonUtility.FromJson<GameDatas>(datas);
sr.Close();
return team;
}
//獲取按鈕的位置當點擊之後獲取位置
private Vector3 GetPosition(Button bt)
{
return bt.transform.position;
}
}