Unity3D遊戲開發——物品存儲:List與Dictionary
阿新 • • 發佈:2019-04-06
方法 簡介 數量 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