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


本篇簡介

  • 本文介紹如何將碰撞處理后的物體存儲在管理器中,分別用到兩種不同的數據結構——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();  //將物品添加到列表並將列表信息打印到控制台
    }
···
  • 運行結果:

參考文檔


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM