溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

[Unity插件]LitJson雜談

發(fā)布時(shí)間:2020-07-29 22:40:53 來(lái)源:網(wǎng)絡(luò) 閱讀:423 作者:蓬萊仙羽 欄目:開(kāi)發(fā)技術(shù)

開(kāi)場(chǎng)白


LitJson是一個(gè)開(kāi)源項(xiàng)目,比較小巧輕便,安裝也很簡(jiǎn)單,在Unity里只需要把LitJson.dll放到Plugins文件夾下,并在代碼的最開(kāi)頭添加 “Using LitJson”就可以了。簡(jiǎn)單來(lái)說(shuō),LitJson的用途是實(shí)現(xiàn)Json和代碼數(shù)據(jù)之間的轉(zhuǎn)換,一般用于從服務(wù)器請(qǐng)求數(shù)據(jù),得到返回的Json后進(jìn)行轉(zhuǎn)換從而在代碼里可以訪問(wèn)。具體請(qǐng)?jiān)斠?jiàn)LitJson的官網(wǎng)。

關(guān)于和服務(wù)器數(shù)據(jù)之間的轉(zhuǎn)換在此就不再贅述,官網(wǎng)以及一些博客里已有涉及,而且也比較詳細(xì)了。

這里,主要談一下LitJson的其他用途。

想象一個(gè)場(chǎng)景,你需要顯示一個(gè)家庭信息的表格,這個(gè)表格的每一行代表了你的一個(gè)家人的名字、年齡、手機(jī)號(hào)碼和住址等信息。因?yàn)檫@個(gè)信息不大,用數(shù)據(jù)庫(kù)實(shí)在是大材小用,而且也很麻煩。

我們可以用一個(gè)數(shù)據(jù)結(jié)構(gòu)來(lái)在代碼里表示每個(gè)家人的信息:

[csharp] view plaincopyprint?[Unity插件]LitJson雜談[Unity插件]LitJson雜談
  1. public class FamilyInfo {  
  2.     public string name;  
  3.     public int age;  
  4.     public string tellphone;  
  5.     public string address;  
  6. }  


然后用一個(gè)List來(lái)表示家庭信息表:

[csharp] view plaincopyprint?[Unity插件]LitJson雜談[Unity插件]LitJson雜談
  1. public class FamilyList {  
  2.     public List<FamilyInfo> family_list;  
  3. }  


最后,打印信息:
[csharp] view plaincopyprint?[Unity插件]LitJson雜談[Unity插件]LitJson雜談
  1. private void DisplayFamilyList(FamilyList familyList) {  
  2.     if (familyList == nullreturn;  
  3.           
  4.     foreach (FamilyInfo info in familyList.family_list) {  
  5.         Debug.Log("Name:" + info.name + " Age:" + info.age + " Tel:" + info.tellphone + " Addr:" + info.address);  
  6.     }  
  7. }  
  

準(zhǔn)備工作都已經(jīng)做好,那么數(shù)據(jù)到底在什么時(shí)候初始化呢?

第一種方法

一種方法是我們可以在編輯面板里直接初始化。為了達(dá)到目的,我們還需要告訴Unity編輯器在面板里顯示我們的FamilyInfo,以便我們可以隨機(jī)編輯,這是通過(guò)在類名前聲明

[System.Serializable]來(lái)實(shí)現(xiàn)的。

具體代碼如下:

[csharp] view plaincopyprint?[Unity插件]LitJson雜談[Unity插件]LitJson雜談
  1. sing System.Collections;  
  2. using System.Collections.Generic;  
  3. using LitJson;  
  4.   
  5. [System.Serializable]  
  6. public class FamilyInfo {  
  7.     public string name;  
  8.     public int age;  
  9.     public string tellphone;  
  10.     public string address;  
  11. }  
  12.   
  13. [System.Serializable]  
  14. public class FamilyList {  
  15.     public List<FamilyInfo> family_list;  
  16. }  
  17.   
  18. public class LitJsonSample : MonoBehaviour {  
  19.       
  20.     public FamilyList m_FamilyList = null;  
  21.       
  22.     // Use this for initialization  
  23.     void Start () {  
  24.         DisplayFamilyList(m_FamilyList);  
  25.     }  
  26.       
  27.     private void DisplayFamilyList(FamilyList familyList) {  
  28.         if (familyList == nullreturn;  
  29.           
  30.         foreach (FamilyInfo info in familyList.family_list) {  
  31.             Debug.Log("Name:" + info.name + "       Age:" + info.age + "        Tel:" + info.tellphone + "      Addr:" + info.address);  
  32.         }  
  33.     }  
  34.       
  35.     // Update is called once per frame  
  36.     void Update () {  
  37.       
  38.     }  
  39. }  


運(yùn)行結(jié)果如下:
[Unity插件]LitJson雜談


但是這種方法靈活性太差,而且很容易發(fā)生錯(cuò)誤。例如當(dāng)我們不小心改變了變量名稱,那么我們?cè)诿姘謇锞庉嫼玫臄?shù)據(jù)就都會(huì)不見(jiàn)了!下面介紹另一種比較好的方法——把數(shù)據(jù)保存為本地的一個(gè)文本文件。


第二種方法


正如前面所說(shuō),我們把信息存成一個(gè)表格,并保存為txt格式。注意,為了能使用LitJson解析,txt中必須使用Json格式。
family.txt如下:
[plain] view plaincopyprint?[Unity插件]LitJson雜談[Unity插件]LitJson雜談
  1. {  
  2.     "family_list": [  
  3.         {  
  4.             "name" : "candycat",  
  5.             "age" : 21,  
  6.             "tellphone" : "xxx",  
  7.             "address" : "xxx"  
  8.         },  
  9.         {  
  10.             "name" : "candycat#",  
  11.             "age" : 22,  
  12.             "tellphone" : "xxx",  
  13.             "address" : "xxx"  
  14.         },  
  15.         {  
  16.             "name" : "candycat##",  
  17.             "age" : 23,  
  18.             "tellphone" : "xxx",  
  19.             "address" : "xxx"  
  20.         }  
  21.     ]  
  22. }  

代碼如下:
[csharp] view plaincopyprint?[Unity插件]LitJson雜談[Unity插件]LitJson雜談
  1. using UnityEngine;  
  2. using UnityEditor;  
  3. using System.Collections;  
  4. using System.Collections.Generic;  
  5. using LitJson;  
  6.   
  7. public class FamilyInfo {  
  8.     public string name;  
  9.     public int age;  
  10.     public string tellphone;  
  11.     public string address;  
  12. }  
  13.   
  14. public class FamilyList {  
  15.     public List<FamilyInfo> family_list;  
  16. }  
  17.   
  18. public class LitJsonSample : MonoBehaviour {  
  19.       
  20.     public FamilyList m_FamilyList = null;  
  21.       
  22.     // Use this for initialization  
  23.     void Start () {  
  24.         ReloadFamilyData();  
  25.           
  26.         DisplayFamilyList(m_FamilyList);  
  27.     }  
  28.       
  29.     private void ReloadFamilyData()  
  30.     {             
  31.         UnityEngine.TextAsset s = Resources.Load("Localize/family"as TextAsset;   
  32.         string tmp = s.text;  
  33.         m_FamilyList = JsonMapper.ToObject<FamilyList>( tmp );  
  34.         if ( JsonMapper.HasInterpretError() )  
  35.         {  
  36.             Debug.LogWarning( JsonMapper.GetInterpretError() );  
  37.         }  
  38.     }  
  39.       
  40.     private void DisplayFamilyList(FamilyList familyList) {  
  41.         if (familyList == nullreturn;  
  42.           
  43.         foreach (FamilyInfo info in familyList.family_list) {  
  44.             Debug.Log("Name:" + info.name + "       Age:" + info.age + "        Tel:" + info.tellphone + "      Addr:" + info.address);  
  45.         }  
  46.     }  
  47.       
  48.     // Update is called once per frame  
  49.     void Update () {  
  50.       
  51.     }  
  52. }  

有幾點(diǎn)注意的地方:
  • Resources.Load("Localize/family")表示加載family文件,但一定要注意要把family.txt文件放在Resources文件夾下,只有這樣Resources.Load才能夠訪問(wèn)到,在這個(gè)例子里family的絕對(duì)路徑為“Resources/Localize/family”。這是因?yàn)?span >Resources文件夾是Unity默認(rèn)的資源文件夾,有著特殊的用途,這里我還不是很了解,以后要深入學(xué)習(xí)一下;
  • Resources.Load參數(shù)中的路徑名一定不可以包含后綴,這里也就是.txt后綴;

輸出結(jié)果和第一種方法完全一樣。

注意

使用LitJson解析時(shí),解析類(如上面的FamilyInfo)若包含Dictionary結(jié)構(gòu),則key的類型必須是string,而不能是int類型(如需表示id等),否則無(wú)法正確解析!

插件下載地址:http://download.csdn.net/detail/candycat1992/6624695
向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

un j
AI