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

參考文檔