本篇简介

  • 本文介绍如何将碰撞处理后的物体存储在管理器中,分别用到两种不同的数据结构——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(); //将物品添加到列表并将列表信息打印到控制台
}
···
  • 运行结果:

参考文档

Unity3D游戏开发——物品存储:List与Dictionary的更多相关文章

  1. Unity3D游戏开发从零单排(四) - 制作一个iOS游戏

    提要 此篇是一个国外教程的翻译,尽管有点老,可是适合新手入门. 自己去写代码.debug,布置场景,能够收获到非常多.游戏邦上已经有前面两部分的译文,这里翻译的是游戏的最后一个部分. 欢迎回来 在第一 ...

  2. [Unity3D]Unity3D游戏开发3D选择场景中的对象,并显示轮廓效果强化版

    大家好,我是秦培,欢迎关注我的博客,我的博客地址blog.csdn.net/qinyuanpei. 在上一篇文章中,我们通过自己定义着色器实现了一个简单的在3D游戏中选取.显示物体轮廓的实例. 在文章 ...

  3. [Unity3D]Unity3D游戏开发之跑酷游戏项目解说

    大家好,我是秦元培.我參加了CSDN2014博客之星的评选,欢迎大家为我投票,同一时候希望在新的一年里大家能继续支持我的博客. 大家晚上好.我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.c ...

  4. Unity3D游戏开发初探—2.初步了解3D模型基础

    一.什么是3D模型? 1.1 3D模型概述 简而言之,3D模型就是三维的.立体的模型,D是英文Dimensions的缩写. 3D模型也可以说是用3Ds MAX建造的立体模型,包括各种建筑.人物.植被. ...

  5. 从一点儿不会开始——Unity3D游戏开发学习(一)

    一些废话 我是一个windows phone.windows 8的忠实粉丝,也是一个开发者,开发数个windows phone应用和两个windows 8应用.对开发游戏一直抱有强烈兴趣和愿望,但奈何 ...

  6. Unity3D游戏开发之连续滚动背景

    Unity3D游戏开发之连续滚动背景 原文  http://blog.csdn.net/qinyuanpei/article/details/22983421 在诸如天天跑酷等2D游戏中,因为游戏须要 ...

  7. [Unity3D]Unity3D游戏开发之飞机大战项目解说

    大家好,我是秦元培,欢迎大家继续关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei. 首先感谢大家对我博客的关注,今天我想和大家分享的是一个飞机大战的项目.这是一个比較综合的 ...

  8. [Unity3D]Unity3D游戏开发《反对》说到游戏(上)——目标跟踪

    朋友,大家好.我是秦培,欢迎关注我的博客.我的博客地址blog.csdn.net/qinyuanpei. 首先博主要自我反省,过了这么久才来更新博客,这段时间主要是在忙着写期末的作业,所以博主基本上没 ...

  9. [Unity3D]Unity3D游戏开发之异步记载场景并实现进度条读取效果

    大家好,我是秦元培.欢迎大家关注我的博客,我的博客地址是:blog.csdn.net/qinyuanpei.终于在各种无语的论文作业中解脱了,所以立即抓紧时间来这里更新博客.博主本来计划在Unity3 ...

随机推荐

  1. spark上的一些常用命令(一)

    1. 加速跑 spark-sql --name uername --num-executors --driver-memory 8G --executor-memory 8G 2. 上传数据 建表 ) ...

  2. Deepin15.8系统下安装QorIQ Linux SDK v2.0 yocto成功完美运行的随笔

    2019.2.17日:最终安装成功,完美解决! 2019.2.16日:最终安装未成功,但是过程中排除 了几个bug,前进了几步,仅供参考. 写在最前面,yocto安装是有系统要求的,Deepin 15 ...

  3. C中gets()函数与scanf()函数说明

    scanf( )函数和gets( )函数都可用于输入字符串,但在功能上有区别.若想从键盘上输入字符串"hi hello",则应该使用 gets 函数. gets可以接收空格:而sc ...

  4. 【转】SVG与HTML、JavaScript的三种调用方式

    原文:https://www.cnblogs.com/guohu/p/5085045.html SVG与HTML.JavaScript的三种调用方式 一.在HTMl中访问SVG的DOM 1 2 3 4 ...

  5. 2_C语言中的数据类型 (四)整数与无符号数

    1.1       sizeof关键字 sizeof是c语言关键字,功能是求指定数据类型在内存中的大小,单位:字节 sizeof与size_t类型 1.1       int类型 1.1.1      ...

  6. Floodlight下发流表过程分析

    https://blog.csdn.net/vonzhoufz/article/details/32166445 当一个packet到达openflow交换机,会进行流表的匹配,如果没有找到相应的流表 ...

  7. SQL Server 小数类型(float 和 decimal)

    在SQL Server中,实际上小数数值只有两种数据类型:float 和 decimal,分别是近似数值和精确数值.其他小数类型,都可以使用float和decimal来替代,例如,双精度(double ...

  8. UWP 应用程序名称本地化以及商店显示名称本地化

    大家应该都知道,在做多语言的时候,我们一般会让App名字也会随着语言变化而本地化. 比如我的App微识别 https://www.microsoft.com/store/productId/9PDSN ...

  9. python将oracle中的数据导入到mysql中。

    一.导入表结构.使用工具:navicate premium 和PowerDesinger 1. 先用navicate premium把oracle中的数据库导出为oracle脚本. 2. 在Power ...

  10. 取值:form表单取值、input框绑定取值

    1. form表单取值1.1 方式一,通过<form bindsubmit="formSubmit">与<button formType="submit ...