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();  //将物品添加到列表并将列表信息打印到控制台
    }
···
  • 运行结果:

参考文档

posted @ 2019-04-06 01:11  苏木木木  阅读(4952)  评论(0编辑  收藏  举报