Unity3D日常開發】(三十九)Unity3D中解析Txt文檔,賦值給Text案例

      網友投稿 700 2022-05-30

      推薦閱讀

      CSDN主頁

      GitHub開源地址

      Unity3D插件分享

      簡書地址

      我的個人博客

      QQ群:1040082875

      一、前言

      有小伙伴跟我說,公司現在需要解析JSON,但是百度的解析JSON的又各種各樣,我都看懵了,有沒有好一點的解析方案,然后我就將我這篇文章推送給了他【Unity3D日常】Unity寫Json數據,以及在Unity讀取、解析Json數據。

      過了一晚上,又跟我說,不行啊,雖然只要解析JSON了,但是步驟還是不太理解,怎么保存值呀,怎么賦值呀,都不會。

      我說,那你把文檔發給我,把需求跟我說一下,我整理一篇文章,讓小伙們下次遇到這個問題知道總體流程了。

      二、需求分析

      需求

      要從文檔中讀取所有的地鐵線路和每條線路的站點,然后可以點擊不同的線路切換顯示不同的站點。

      流程步驟

      【Unity3D日常開發】(三十九)Unity3D中解析Txt文檔,賦值給Text案例

      數據文檔→讀取數據→解析數據→保存數據

      分析

      (1)要有線路和站點的對應關系數據文檔,這個已經有了:

      (2)讀取數據

      讀取數據沒啥好說的,無論是json文件還是xml文件還是txt文件

      使用File FileStream SteamReader StreamWriter 讀取文件 都可以

      每種寫法都能百度出來

      (3)解析數據

      解析數據,方式也很多,以JSON為類,可以使用插件,也可以使用Unity自帶的JSON解析類

      插件:LitJSON解析、Newtonsoft.Json.dll

      Unity自帶解析JSON的類:JsonUtility

      用那個都可以。

      如果是txt數據,那么就要分析每一行的數據,如何切分,然后進行保存,比如:

      1 1號線 103 蘋果園 1 1號線 104 古城 1 1號線 105 八角游樂園 1 1號線 106 八寶山 1 1號線 107 玉泉路 1 1號線 108 五棵松 1 1號線 109 萬壽路 1 1號線 110 公主墳 1 1號線 111 軍事博物館 1 1號線 112 木樨地 1 1號線 113 南禮士路

      這段數據,最后是\r\n表示跳到下一行,中間以空格切分也就是\t

      那么就可以先用\r\n切分每一行,然后用\t切換每一列,這樣就將數據分析出來了。

      (4)保存數據

      最后一步,是保存,JSON解析完之后,需要保存到特定的跟JSON解析后匹配的類中,比如:

      { "name":"小明", "age":20, "interests":["sing","run"] }

      那么,解析的類也要有這幾個值,而且要一一對應,不能有錯,包括字母大小寫:

      [System.Serializable] public class ModelTest { public string name; public int age; public string[] interests; }

      那么,接收到的JSON數據怕生成類的時候出錯怎么辦,這時候就可以使用JSON數據轉實體的功能:

      https://www.json.cn/json/json2csharp.html

      一鍵生成實體類,媽媽再也不用擔心我出錯了。

      然后,用這個實體去接收解析好的JSON數據就可以了:

      ModelTest obj = JsonUtility.FromJson(jsonTest);

      jsonTest是JSON數據,ModelTest就是跟JSON數據匹配的實體。

      那如果是txt一行一行讀取的數據呢,比如:

      1 1號線 103 蘋果園 1 1號線 104 古城 1 1號線 105 八角游樂園 1 1號線 106 八寶山 1 1號線 107 玉泉路 1 1號線 108 五棵松 1 1號線 109 萬壽路 1 1號線 110 公主墳 1 1號線 111 軍事博物館 1 1號線 112 木樨地 1 1號線 113 南禮士路

      這個,就需要分析結構,然后使用數組或者List或者字典去保存了。

      這個是一條地鐵線,包含多個站點,每個站點有多個屬性,可以使用自定義類,然后使用List去接收這個數據,比如:

      using System.Collections; using System.Collections.Generic; using UnityEngine; public class ReadData : MonoBehaviour { List Stations; void Start() { } } public struct StationInfo { public int lineid; //線路編號 public string linename; //線路名稱 public string stationid; //車站編號 public string stationname; //車站名稱 }

      三、實現

      3-1 讀取數據

      using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; public class ReadData : MonoBehaviour { List Stations; string Content; void Start() { //讀取數據 ReadFileData(); } void ReadFileData() { string pathstations = Application.streamingAssetsPath + "/Stations_2018.txt"; using (StreamReader SR = new StreamReader(pathstations)) { //將所有的數據從文件以流形式保存到 Content Content = SR.ReadToEnd(); SR.Close(); SR.Dispose(); } } } public struct StationInfo { public int lineid; //線路編號 public string linename; //線路名稱 public string stationid; //車站編號 public string stationname; //車站名稱 }

      3-2 解析數據

      //解析數據 List ParseStations() { if (!string.IsNullOrEmpty(Content)) { List info = new List(); string[] strarray = Content.Split(new char[] { '\r', '\n' }, System.StringSplitOptions.RemoveEmptyEntries); for (int i = 1; i < strarray.Length; i++) { string[] Columns = strarray[i].Split(new char[] { '\t' }, System.StringSplitOptions.RemoveEmptyEntries); StationInfo stationInfo = new StationInfo(); stationInfo.lineid = int.Parse(Columns[0]); stationInfo.linename = Columns[1]; stationInfo.stationid = Columns[2]; stationInfo.stationname = Columns[3]; info.Add(stationInfo); } return info; } return null; }

      3-3 保存數據

      //保存數據 Stations = ParseStations();//線路編號 線路名稱 車站編號 車站名稱

      完整代碼:

      using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; public class ReadData : MonoBehaviour { List Stations; string Content; void Start() { //讀取數據 ReadFileData(); } void ReadFileData() { string pathstations = Application.streamingAssetsPath + "/Stations_2018.txt"; using (StreamReader SR = new StreamReader(pathstations)) { //將所有的數據從文件以流形式保存到 Content Content = SR.ReadToEnd(); SR.Close(); SR.Dispose(); //保存數據 Stations = ParseStations();//線路編號 線路名稱 車站編號 車站名稱 } } //解析數據 List ParseStations() { if (!string.IsNullOrEmpty(Content)) { List info = new List(); string[] strarray = Content.Split(new char[] { '\r', '\n' }, System.StringSplitOptions.RemoveEmptyEntries); for (int i = 1; i < strarray.Length; i++) { string[] Columns = strarray[i].Split(new char[] { '\t' }, System.StringSplitOptions.RemoveEmptyEntries); StationInfo stationInfo = new StationInfo(); stationInfo.lineid = int.Parse(Columns[0]); stationInfo.linename = Columns[1]; stationInfo.stationid = Columns[2]; stationInfo.stationname = Columns[3]; info.Add(stationInfo); } return info; } return null; } } public struct StationInfo { public int lineid; //線路編號 public string linename; //線路名稱 public string stationid; //車站編號 public string stationname; //車站名稱 }

      3-4 生成地鐵線

      先擺個UI:

      將這兩個按鈕分別做成預制體,命名為MetroLinePar、MetroSitePar,放到Resources文件夾下面:

      編寫代碼:

      using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; using UnityEngine.UI; public class ReadData : MonoBehaviour { List Stations; string Content; public GameObject MetroLinePanel; private GameObject MetroLinePar; public GameObject MetroSitePanel; private GameObject MetroSitePar; void Start() { //讀取數據 ReadFileData(); MetroLinePar = Resources.Load("MetroLinePar"); MetroLinePar = Resources.Load("MetroSitePar"); //生成UI CreateUI(); } void CreateUI() { //找出所有地鐵線 Dictionary MetroLine = new Dictionary(); for (int i = 0; i < Stations.Count; i++) { if (!MetroLine.ContainsKey(Stations[i].lineid)) { MetroLine.Add(Stations[i].lineid, Stations[i].linename); } } //生成地鐵線 foreach (var item in MetroLine) { GameObject MetroLineItem = Instantiate(MetroLinePar, Vector3.zero, Quaternion.identity, MetroLinePanel.transform); MetroLineItem.GetComponentInChildren().text = item.Value; } } void ReadFileData() { string pathstations = Application.streamingAssetsPath + "/Stations_2018.txt"; using (StreamReader SR = new StreamReader(pathstations)) { //將所有的數據從文件以流形式保存到 Content Content = SR.ReadToEnd(); SR.Close(); SR.Dispose(); //保存數據 Stations = ParseStations();//線路編號 線路名稱 車站編號 車站名稱 } } //解析數據 List ParseStations() { if (!string.IsNullOrEmpty(Content)) { List info = new List(); string[] strarray = Content.Split(new char[] { '\r', '\n' }, System.StringSplitOptions.RemoveEmptyEntries); for (int i = 1; i < strarray.Length; i++) { string[] Columns = strarray[i].Split(new char[] { '\t' }, System.StringSplitOptions.RemoveEmptyEntries); StationInfo stationInfo = new StationInfo(); stationInfo.lineid = int.Parse(Columns[0]); stationInfo.linename = Columns[1]; stationInfo.stationid = Columns[2]; stationInfo.stationname = Columns[3]; info.Add(stationInfo); } return info; } return null; } } public struct StationInfo { public int lineid; //線路編號 public string linename; //線路名稱 public string stationid; //車站編號 public string stationname; //車站名稱 }

      運行:

      所有的地鐵線有,下面就需要將每條地鐵線的每個站點對應起來。

      3-5 生成站點

      using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; using UnityEngine.UI; public class ReadData : MonoBehaviour { List Stations; string Content; public GameObject MetroLinePanel; private GameObject MetroLinePar; public GameObject MetroSitePanel; private GameObject MetroSitePar; void Start() { //讀取數據 ReadFileData(); MetroLinePar = Resources.Load("MetroLinePar"); MetroSitePar = Resources.Load("MetroSitePar"); //生成UI CreateMetroLine(); } void CreateMetroLine() { //找出所有地鐵線 Dictionary MetroLine = new Dictionary(); for (int i = 0; i < Stations.Count; i++) { if (!MetroLine.ContainsKey(Stations[i].lineid)) { MetroLine.Add(Stations[i].lineid, Stations[i].linename); } } //生成地鐵線 foreach (var item in MetroLine) { GameObject MetroLineItem = Instantiate(MetroLinePar, Vector3.zero, Quaternion.identity, MetroLinePanel.transform); MetroLineItem.GetComponentInChildren().text = item.Value; //生成站點 MetroLineItem.GetComponent

      上一篇:內幕:阿里老測試員告訴你,新人如何做好功能測試,學會這幾項
      下一篇:【Java基礎】大廠都開始重視的基礎很重要嗎?快來加入基礎的學習,鞏固一下細枝末角,刷刷面試題吧
      相關文章
      亚洲电影免费观看| 亚洲色av性色在线观无码| 亚洲国产成人精品青青草原| 亚洲激情在线观看| 久久国产亚洲精品麻豆| 亚洲毛片αv无线播放一区| 国产成人亚洲精品狼色在线| 亚洲综合色在线观看亚洲| 亚洲午夜福利精品久久| 亚洲?v女人的天堂在线观看| 亚洲XX00视频| 亚洲一区二区三区免费| AV在线亚洲男人的天堂| 中文字幕亚洲第一| 亚洲精品国产精品乱码在线观看| 亚洲色爱图小说专区| 国产AV无码专区亚洲A∨毛片| 亚洲AV综合色区无码一区爱AV| 亚洲AV无码久久| 亚洲第一福利网站| 亚洲成a人片在线观看播放| 亚洲人成影院午夜网站| 亚洲三级高清免费| 亚洲av无一区二区三区| 亚洲成a人在线看天堂无码| 亚洲综合区小说区激情区| 亚洲午夜国产精品无码 | 亚洲午夜久久久影院伊人| 亚洲精品无码高潮喷水在线| 亚洲高清国产拍精品26U| 亚洲最大福利视频网站| 亚洲女人影院想要爱| 一区二区亚洲精品精华液| 日韩国产欧美亚洲v片 | 看亚洲a级一级毛片| 亚洲国产免费综合| 亚洲色婷婷一区二区三区| 婷婷精品国产亚洲AV麻豆不片| 亚洲国产二区三区久久| 亚洲大片免费观看| 亚洲AV成人一区二区三区观看 |