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

    参考文档

  • 相关阅读:
    Ubuntu在下面LAMP(Linux+Apache+MySQL+PHP) 开发环境的搭建
    直接插入排序、折半插入排序、Shell排序、冒泡排序,选择排序
    java插入字符串
    bash,bg,bind,break,builtin,caller,compgen, complete,compopt,continue,declare,dirs,disown,enable,eval,exec,expo
    socket用法
    org.jsoup.select.Selector
    达达技术
    CentOS 6.4 文件夹打开方式
    shell加法
    shell统计
  • 原文地址:https://www.cnblogs.com/Akyy/p/10657524.html
Copyright © 2020-2023  润新知