1. 程式人生 > >關於Unity中常用的數據結構和JSON處理(專題三)

關於Unity中常用的數據結構和JSON處理(專題三)

collect mono true system code ... 互聯網 打印 lua

數據結構通俗來講就是用某個對象去存儲數據集合,比如要存儲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 void
Update () { } }

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處理(專題三)