1. 程式人生 > >Unity3D遊戲開發——物品存儲:List與Dictionary

Unity3D遊戲開發——物品存儲:List與Dictionary

方法 簡介 數量 tail splay emd 種類型 修改 控制

本篇簡介

  • 本文介紹如何將碰撞處理後的物體存儲在管理器中,分別用到兩種不同的數據結構——List和Dictionary。我們將繼續在上一篇博客的編程基礎上進行完善。

List和Dictionary的區別

  • List:只由一種類型(將被列入列表的類型)聲明。當收集同一種類的多個物品時,將看到的所有物品都列出,而不是將同類型的物品合並。
  • Dictionary:聲明了鍵(即標識符)和值的類型。即會將標識符相同的物品進行合並,從而增加該標識符的值。

管理器啟動測試

  • 創建一個空的GameObject對象,將其放在(0,0,0),命名為GameManagers,將腳本組件Managers關聯到該對象上,能看見PlayerManager和InventoryManager也自動關聯到物體上。運行遊戲之後,場景無變化,但能在控制臺日誌中看見一系列記錄啟動序列的信息。如果結果正確,則我們可以開始繼續編寫倉庫管理器了。

(1)使用List

將物體添加到Inventory

···
    private List<string> _items;  //添加一個List對象來存放物品

    public void Startup()  
    {
        Debug.Log("InventoryManager starting ...");//任何長任務在這裏啟動

        _items = new List<string>();  //初始化空的物品列表

        status = ManagerStatus.Started;   //如果是長任務,狀態改變為"Initializing"
    }
    private void DisplayItems()  //打印當前倉庫的控制臺信息
    {
        string itemDisplay = "items:";
        foreach(string item in _items)
        {
            itemDisplay += item + " ";
        }
        Debug.Log(itemDisplay);
    }

    public void AddItem(string name)  //其他腳本不可以直接操作列表,但是可以調用這個方法
    {
        _items.Add(name);  

        DisplayItems();  //將物品添加到列表並將列表信息打印到控制臺
    }

···

在碰撞處理文件中使用新的InventoryManager

···
    void OnTriggerEnter(Collider other)
    {
        Managers.Inventory.AddItem(name);
        Destroy(this.gameObject);
    }
···
  • 完善點:1. 添加了一個List對象來存放物品;2. 添加了一個其他代碼都可以調用的公有方法——AddItem(),這個方法將物品添加到列表並將列表信息打印到控制臺。
  • 運行結果:技術分享圖片

(2)使用Dictionary

  • 僅改變Inventory腳本代碼,將List替換成Dictionary;
  • AddItem()方法中,在每個條目加入列表之前,需檢查該條目是否已存在在列表中,用到ContainsKey()方法;
  • 如果是一個新的條目,我們則把計數器置為1,但如果該條目已經存在,則只增加它的數量。

修改的InventoryManager腳本代碼

···
    private Dictionary<string , int> _items;  //添加一個Dictionary對象來存放物品,它由類型鍵和值聲明

    public void Startup()  
    {
        Debug.Log("InventoryManager starting ...");//任何長任務在這裏啟動

        _items = new Dictionary<string, int>();  //初始化空的物品列表

        status = ManagerStatus.Started;   //如果是長任務,狀態改變為"Initializing"
    }
    private void DisplayItems()  //打印當前倉庫的控制臺信息
    {
        string itemDisplay = "items: ";
        foreach(KeyValuePair<string,int>  item in _items)
        {
            itemDisplay += item.Key + "(" + item.Value + ")" ;
        }
        Debug.Log(itemDisplay);
    }

    public void AddItem(string name)  //其他腳本不可以直接操作列表,但是可以調用這個方法
    {
        if(_items.ContainsKey(name))  //在輸入新數據之前,檢查入口是否已經存在
        {
            _items[name] += 1;
        }
        else
        {
            _items[name] = 1;
        }
        DisplayItems();  //將物品添加到列表並將列表信息打印到控制臺
    }
···
  • 運行結果:技術分享圖片

參考文檔

  • C#中泛型集合類List與Dictionary解析
  • 《Unity 5實戰——使用C#和Unity開發多平臺遊戲》,作者Joseph Hocking ,譯者蔡俊鴻。

Unity3D遊戲開發——物品存儲:List與Dictionary