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

参考文档
- C#中泛型集合类List与Dictionary解析
- 《Unity 5实战——使用C#和Unity开发多平台游戏》,作者Joseph Hocking ,译者蔡俊鸿。
Unity3D游戏开发——物品存储:List与Dictionary的更多相关文章
- Unity3D游戏开发从零单排(四) - 制作一个iOS游戏
提要 此篇是一个国外教程的翻译,尽管有点老,可是适合新手入门. 自己去写代码.debug,布置场景,能够收获到非常多.游戏邦上已经有前面两部分的译文,这里翻译的是游戏的最后一个部分. 欢迎回来 在第一 ...
- [Unity3D]Unity3D游戏开发3D选择场景中的对象,并显示轮廓效果强化版
大家好,我是秦培,欢迎关注我的博客,我的博客地址blog.csdn.net/qinyuanpei. 在上一篇文章中,我们通过自己定义着色器实现了一个简单的在3D游戏中选取.显示物体轮廓的实例. 在文章 ...
- [Unity3D]Unity3D游戏开发之跑酷游戏项目解说
大家好,我是秦元培.我參加了CSDN2014博客之星的评选,欢迎大家为我投票,同一时候希望在新的一年里大家能继续支持我的博客. 大家晚上好.我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.c ...
- Unity3D游戏开发初探—2.初步了解3D模型基础
一.什么是3D模型? 1.1 3D模型概述 简而言之,3D模型就是三维的.立体的模型,D是英文Dimensions的缩写. 3D模型也可以说是用3Ds MAX建造的立体模型,包括各种建筑.人物.植被. ...
- 从一点儿不会开始——Unity3D游戏开发学习(一)
一些废话 我是一个windows phone.windows 8的忠实粉丝,也是一个开发者,开发数个windows phone应用和两个windows 8应用.对开发游戏一直抱有强烈兴趣和愿望,但奈何 ...
- Unity3D游戏开发之连续滚动背景
Unity3D游戏开发之连续滚动背景 原文 http://blog.csdn.net/qinyuanpei/article/details/22983421 在诸如天天跑酷等2D游戏中,因为游戏须要 ...
- [Unity3D]Unity3D游戏开发之飞机大战项目解说
大家好,我是秦元培,欢迎大家继续关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei. 首先感谢大家对我博客的关注,今天我想和大家分享的是一个飞机大战的项目.这是一个比較综合的 ...
- [Unity3D]Unity3D游戏开发《反对》说到游戏(上)——目标跟踪
朋友,大家好.我是秦培,欢迎关注我的博客.我的博客地址blog.csdn.net/qinyuanpei. 首先博主要自我反省,过了这么久才来更新博客,这段时间主要是在忙着写期末的作业,所以博主基本上没 ...
- [Unity3D]Unity3D游戏开发之异步记载场景并实现进度条读取效果
大家好,我是秦元培.欢迎大家关注我的博客,我的博客地址是:blog.csdn.net/qinyuanpei.终于在各种无语的论文作业中解脱了,所以立即抓紧时间来这里更新博客.博主本来计划在Unity3 ...
随机推荐
- STM32 HAL库学习系列第1篇 ADC配置 及 DAC配置
ADC工作均为非阻塞状态 轮询模式 中断模式 DMA模式 库函数: HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc);//轮询模式,需放 ...
- LeetCode 队列与BFS--岛屿的数量
tags = ["leetcode","队列","BFS","C++","Go"] 岛屿的个数 给定 ...
- Rust 智能指针(一)
Rust 智能指针(一) 1.Box<T> Box<T>是指向堆中的指针. fn main() { let box = Box::new(3); println!(" ...
- 2017-2018-1 20155305 《信息安全系统设计基础》第四周学习总结(课堂提交作业未来得及提交码云链接myod补充博客)
2017-2018-1 20155305 <信息安全系统设计基础>第四周学习总结(课堂提交作业未来得及提交码云链接myod补充博客) 课堂提交题目要求 编写MyOD.java 用java ...
- 25-[jQuery]-事件
重点:jQuery事件绑定on().bind()与delegate() 方法详解 1.jquery的事件 <!DOCTYPE html> <html lang="en&qu ...
- UWP 轨道视图Orbit View
先看一下效果吧 这是我的Music Tags App里面的效果图,当然你也可以做的比我的更炫. 其实这个效果的实现来自于控件UWP Community Toolkit的OrbitView,所以大家要多 ...
- Cloud Native Weekly | 华为云抢先发布Redis5.0,红帽宣布收购混合云提供商 NooBaa
1——华为云抢先发布Redis5.0 2——DigitalOcean K8s服务正式上线 3——红帽宣布收购混合云提供商 NooBaa 4——微软发布多项 Azure Kubernetes 服务更新 ...
- C#四则运算器(多态方法实现)
在上一节C#课上,我们学习了用类的继承的方式来做一个四则运算器,然而老师的代码在课上演示的效果并不理想,而且没有使用多态的思想实现,今天我们就来用多态的方式实现四则运算器. 1. 题目及要求 2. A ...
- linux 开机报错,error grub_efi_find_mmap_size not find
开机报错,差点以为要重装系统了 搜到了官方的重建引导的教程 修复了错误 https://wiki.manjaro.org/index.php/Restore_the_GRUB_Bootloader#F ...
- 《杜增强讲Unity之Tanks坦克大战》6-发射子弹
6 发射子弹 本节完成发射子弹的功能,最终代码如下: image 首先,发射子弹得确定发射的位置和方向,还有发射的初始速度.具体的发射速度和按下发射按键的时间长短有关,这个关于子弹的蓄力我们在第九 ...