本篇简介

  • 本文介绍如何将碰撞处理后的物体存储在管理器中,分别用到两种不同的数据结构——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. JavaWeb基础—XML学习小结

    一.概述 是什么? 指可扩展标记语言 能干什么? 传输和存储数据 怎么干? 需要自行定义标签. XML 独立于硬件.软件以及应用程序 通常.建立完xml文件后首要的任务是:引入约束文件! 二.XML简 ...

  2. struts2第一天——入门和基本操作

    一.概述 1.运用场景: 应用于三层架构中web层的框架(显示层的运用),是经典MVC模型的web应用的变体. 2.与struts1的对比: struts2是在struts1基于webwork发展的全 ...

  3. Maven Java项目添加Scala语言支持

    为了在一个普通的使用Maven构建的Java项目中,增加对Scala语言的支持.使得其能够同时编译Java和Scala语言的文件.其实很简单的一件事情,只需要在pom.xml文件中的build部分中的 ...

  4. matplotlib绑定到PyQt5(有菜单)

    稍微复杂地实现matplotlib绑定到PyQt5(有菜单) [知识点] import matplotlib matplotlib.use("Qt5Agg") [效果图] [源代码 ...

  5. 洛谷 2953 [USACO09OPEN]牛的数字游戏Cow Digit Game

    洛谷 2953 [USACO09OPEN]牛的数字游戏Cow Digit Game 题目描述 Bessie is playing a number game against Farmer John, ...

  6. 学习OpenCV——SVM

    学习OpenCV——SVM 学习SVM,首先通过http://zh.wikipedia.org/wiki/SVM, 再通过博客http://blog.csdn.net/yang_xian521/art ...

  7. Bash shell 常用快捷键

    1,ctrl+c  :强制终止当前命令 2,ctrl+l   :清屏 3,ctrl+a  :光标移动到行首 4,ctrl+e   :光标移动到行尾 5,ctrl+u   :从光标所在位置删除到行首 6 ...

  8. [算法]用JAVA实现快速排序

    问题描述: 实现对数组的普通快速排序与随机快速排序实验要求: (1)实现上述两个算法 (2)统计算法的运行时间 (3)分析性能差异,作出总结 代码: 一:普通快速排序 public class Qui ...

  9. C#英文数字混合验证

    日常可见的验证码,当然不会这么简单,不过算是基本验证码中比较经典的,可以做一点参考,欢迎有更好方法的大哥们指正 using System; using System.Collections.Gener ...

  10. c# table 怎么在前台循环展示 ViewBag

    后台 public ActionResult DoctorEvaluation()//前台页面 { HE_Department HE_dt = new HE_Department(); DataTab ...