關於Unity中常用的數據結構和JSON處理(專題三)
數據結構通俗來講就是用某個對象去存儲數據集合,比如要存儲100個整數,要用什麽樣的數據類型能把它們存儲好。
Jason處理,服務器對接,配置文件的使用,Unity和Jason之間相互的轉換。
Array
數組
1: 類型[] 名字 = new 類型[數量]{“初始化的值”, “”, ‘‘”}; 如果有初始值也可以省略大小;
2: 優點:
(1)內存連續,速度快;
3: 缺點:
(1)大小固定,容易訪問越界;
Array實例
1.創建Unity項目和文件目錄,保存場景
2.創建一個空節點GameObject,創建一個腳本jason_test掛載在GameObject下面
打開jason_test
using System.Collections; using System.Collections.Generic; using UnityEngine; public class jason_test : MonoBehaviour { // Use this for initialization void Start () { // 數組 // string, 數組 string[] str_array = new string[] { "yes", "blake", "hello" };//可以寫string[3],也可以不寫int[] int_array = new int[100]; // 索引來訪問0 int_array[0] = 1; int_array[1] = 2; // end Debug.Log("Length = " + int_array.Length); // 優點:連續的內存, 訪問速度快,通過數組名稱加索引就能訪問,存儲,使用。 // 缺點:大小是固定,已經創建就不能加大/縮小; } // Update is called once per frame voidUpdate () { } }
3.運行結果
ArrayList
1: 屬於 System.Collections 命令空間
2: ArrayList l = new ArrayList();
3: 操作:添加 Add(數據), 修改[index] = 內容, 刪除 RemoveAt(index);
4: 優點:
(1)不用固定大小;
(2)可以存放任意類型;
5: 缺點
(1)由於存放不同類型的數據,導致很多看不見的性能消耗, 多次轉換等;
ArrayList實例
1.創建Unity項目和文件目錄,保存場景
2.創建一個空節點GameObject,創建一個腳本jason_test掛載在GameObject下面
打開jason_test
using System.Collections; using System.Collections.Generic; using UnityEngine; public class jason_test : MonoBehaviour { // Use this for initialization void Start () { // ArrayList // 大小是靈活的,不是一開始寫死的 // 所有的操作都是Object,Object是C#的基類,所有的數據類型都是基於Object類 ArrayList array_list = new ArrayList(); // 同一個list裏面我可以是不同類型的數據; array_list.Add("string"); array_list.Add(true); array_list.Add(false); array_list.Add(100); array_list.Add(10.5f); // array_list是把所有的對象都當作Object來處理,所以拿到的對象要強制轉換為具體的類型 // [索引]訪問, 0開始 string a = (string)array_list[0]; Debug.Log(a); array_list.RemoveAt(0); // 刪除第0個元素,刪除之後原來的第1個元素就變成第0個 array_list[0] = false; bool e = (bool)array_list[0]; Debug.Log(e); } // Update is called once per frame void Update () { } }
3.運行結果
List<T>
是介於Array和ArrayList之間的一種類型,比Array靈活,但是又沒有ArrayList那麽靈活
1: 屬於 using System.Collections.Generic; 命令空間
2: List<T> l = new List<T>();
3: 操作:
添加 Add(數據), 修改[index] = 內容, 刪除 RemoveAt(index);
4: 優點:
(1)不用固定大小;
(2)存儲的類型是泛型模板,比較靈活, 每個對象實例只能存儲一個類型,沒有那麽多的強制轉換操作,性能提高一點。
List<T>實例
1.創建Unity項目和文件目錄,保存場景
2.創建一個空節點GameObject,創建一個腳本jason_test掛載在GameObject下面
打開jason_test
using System.Collections; using System.Collections.Generic; using UnityEngine; public class jason_test : MonoBehaviour { // Use this for initialization void Start () { // List<T>,一般都用這個 // List<T> 指定模板,那麽List就是存放這種數據類型 List<float> float_list = new List<float>(); float_list.Add(5.3f); float_list.Add(5.4f); // 訪問,讀寫 Debug.Log(float_list[0]); float_list[1] = 8; Debug.Log(float_list[1]); //打印List大小 Debug.Log(float_list.Count); float_list.RemoveAt(0); Debug.Log(float_list.Count); } // Update is called once per frame void Update () { } }
3.運行結果
Dictionary<K, T>
1: 屬於 using System.Collections.Generic; 命令空間
2: Dictionary<KT, VT> l = new Dictionary<KT, VT>(); key --> value,key --> value。key可以是字符串,整數,也可以是其他的泛型的類型。
3: 操作:
添加 Add(數據), 修改[key] = 內容, 刪除 RemoveAt(index);
4: 優點:
(1)不用固定大小;
(2)存儲的類型是泛型模板,比較靈活, 每個dict只能存儲一個類型;
(3) key也是泛型 string, int ....
Dictionary<K, T>實例
1.創建Unity項目和文件目錄,保存場景
2.創建一個空節點GameObject,創建一個腳本jason_test掛載在GameObject下面
打開jason_test
using System.Collections; using System.Collections.Generic; using UnityEngine; public class jason_test : MonoBehaviour { // Use this for initialization void Start () { // 字典 key, value key(模板string, int..), value(模板...) // 比如用string類型的key來存放float類型的value; // key和value的類型確定了就不能更改 Dictionary<string, float> dict = new Dictionary<string,float>(); dict.Add("speed", 100.0f); dict.Add("Attack", 20.0f); Debug.Log(dict.Count); // 2 Debug.Log(dict["speed"]); // 100.0f dict["speed"] = 3.0f; Debug.Log(dict["speed"]); // 3.0f dict.Remove("Attack"); Debug.Log(dict.Count); // 1 } // Update is called once per frame void Update () { } }
3.運行結果
Json數據格式
數據對象都是在內存裏面的,怎樣把內存中的數據對象存到磁盤中去呢?這就需要把內存中的數據轉換成一種數據格式,再存到磁盤中去。
Jason就是把JavaScript的Object對象轉換成一個文本存到磁盤中去。如把字符串存到磁盤裏面,然後從磁盤中再讀字符串出來,再把它反解為JavaScript的Object的內存對象。
1: JSON (JavaScript Object Notation)
隨著JavaScript的流行與互聯網應用,JavaScript裏面最強大的數據類型Object,使用起來極其的方便,能存key--value存的非常好,整數,小數,還能在Object裏面嵌套Object。
為了能更好的做數據交換,設計了JSON協議,能夠將JavaScript裏面的Object,變成可以閱讀的文本數據及JSON數據格式。實現JavaScript裏面的Object與JSON的轉換,Object對象轉換成JSON數據以後,方便傳輸與存儲,JSON變為Object方便對象重建;
2: python語言, Lua語言等其它的腳本語言都有類是於JavaScript的Object數據結構,所以JSON數據能在其它的語言裏面也非常方便的使用;
3: JSON采用完全獨立於語言的文本格式的字符串(string),易於閱讀與編寫以及解析與生成,在很多時候數據交換都采用JSON, 數據--->JSON-->傳輸,存儲--->解碼JSON-->數據
4: 上面的過程又叫序列化與反序列化;
序列化:內存數據---->打包---->介質
反序列化:介質---->解析---->內存數據
Json數據格式
1: JSON Object {}; 裏面為key: value;
2: value為數字, 11.0, 12, 0,
value為bool true, false
value為數組 [ 值, bool, 數組, Object]
value 為Object { key: value}
3: Unity 5.3.x以後自帶的Json數據解析器
5: Unity 5.3以前可以使用第三方的C#庫LitJSon,老技術,沒什麽好講的。
Unity5.3 Jason序列化
1: 序列化與反序列化: 內存數據-->文件存儲介質; 文件存儲介質--->內存數據
2: Unity序列化:
(1) 把要序列化的對象聲明稱:
[System.Serializable], using System; [Serializable]
(2) JsonUtility.toJson(object); // 將對象轉成json字符串;
(3) 將Json字符串的數據解析到對象 JsonUtility.FromJsonOverwrite(json_str, obj);
(4) 當Unity序列化你的腳本的時候,它將僅僅序列化公有域。如果作為附加你也想要Unity去序列化你的一個私有域,你可以添加SerializeField(序列化域)屬性給這個域。
(5) JSON數組:
(6) JSON對象:
3.很多遊戲的數據,可以配到Jason文件裏面,然後從文件裏面讀出來,很多時候互聯網向服務器發送數據,我們也可以來發送Jason文本,然後再解析出數據類型
Jason序列化和反序列化實例
1.創建Unity項目和文件目錄,保存場景
2.創建一個空節點GameObject,創建一個腳本jason_test掛載在GameObject下面
打開jason_test
using System; using System.Collections; using System.Collections.Generic; using UnityEngine; // 聲明一個可序列化的對象 // 對這個聲明可序列化的對象裏面的public成員,做序列化 // [System.Serializable] [Serializable] class sub { public string sub_name = "sub_name"; } [Serializable] class my_object { public int a = 3; public int b = 4; public string age = "blake"; // 不是public,又想序列化? [SerializeField] // 可序列化的字段 bool is_male = true; public int[] int_array;//object裏面定義數組 public sub s;//object裏面定義object } public class jason_test : MonoBehaviour { // Use this for initialization void Start () { // JSON //json序列化 // (1) 使用[Serializable]標記要序列化的對象,是可序列化的 my_object obj = new my_object(); obj.int_array = new int[] { 1, 2, 3 };//初始化 obj.s = new sub();//初始化 // (2) 內存數據對象,序列化成json字符串 string json_string = JsonUtility.ToJson(obj);//序列化成字符串 Debug.Log(json_string); // 有了這個json_string字符串,就可以存儲,傳輸 // json反序列化 my_object obj2 = new my_object();//obj2裏面是混亂的初始值 JsonUtility.FromJsonOverwrite(json_string, obj2);//把json_string字符串解析到obj2中 Debug.Log(obj2.int_array[1]); // 輸出2,說明反序列化成功,已經可以使用解析出來的數據了 } // Update is called once per frame void Update () { } }
3.運行結果
關於Unity中常用的數據結構和JSON處理(專題三)