循环遍历每个数据并做出判断大量数据的存储与引用C#游戏开发快速入门大学霸

循环遍历每个数据并做出判断大量数据的存储与引用C#游戏开发快速入门大学霸

C#游戏开发快速入门

5.3  循环遍历每个数据,并做出判断循环遍历每个数据并做出判断大量数据的存储与引用C#游戏开发快速入门大学霸

很多时候,游戏在玩家做出判断以后,游戏程序会遍历玩家身上大量的所需数据,然后做出判断,即首先判定玩家是否有权限做出这种选择,然后才决定是否为玩家执行此选择。例如,《仙剑奇侠传》这款游戏,进入剧情“荷叶迷宫时”,会要求玩家击碎迷宫里的5尊雕塑,如图5-12所示。但是击碎的前提是,玩家身上必须携带有“锤子”。也就是说系统会遍历玩家身上所有的资源,如果有锤子才能击碎雕塑。

图5-12  《仙剑奇侠传》,荷叶迷宫全图循环遍历每个数据并做出判断大量数据的存储与引用C#游戏开发快速入门大学霸

判断是否有指定的数据,可以使用本章前面所学的if语句来解决。但是目前还存在两个其它的问题:

q  如何在脚本中存储和引用这大量的数据,如果使用变量,显然要声明大量的变量,这样做显然不妥;

q  如果已经得到了大量的数据,该使用什么方式去一一判别呢,难道说要使用大量if语句,去对数据一一判别,这样做显然也不妥;

C#倒是提供了两种机制,可以很有效的解决以上的两个问题,本节会逐个详解介绍它们。

5.3.1  大量数据的存储与引用循环遍历每个数据并做出判断大量数据的存储与引用C#游戏开发快速入门大学霸

C#指定了3种存储与引用大量数据的方法,分别是:数组、列表和字典。本小节会使用简单的小示例依次讲解它们,至于大的游戏示例,会在本章讲解完所有的知识点以后给出。

1.数组

数组可以存储大量同类型的数据,它的声明格式为:

数据类型[ ] 数组名;

q  所有常用的数据类型,在本书第3章中已经使用表格列出了;

q  数据类型后面跟着的是一对中括号“[ ]”;

q  数组名与变量名一样,必须遵循C#的命名规定;

例如,下面的代码语句声明,并且初始化了数组:

int[] myIntArray = {1,3,5,7,9};

读者应该可以从这条语句中看出,声明的是int类型的数组,数组名为myIntArray,存储了5个int类型的数据,分别是1、3、5、7和9。

引用数组中指定数据的格式为:

数组名[下标];

q  下标是从0开始的整数,当下标为0时,表示引用的是数组中的第1个数据;若为3时,表示引用的是数组中的第4个数据;其它数据的引用方式依此类推;

为脚本MyScript添加下面的代码:

01     using UnityEngine;

02     using System.Collections;

03

04     public class MyScript : MonoBehaviour

05     {

06              private int[] myIntArray = {1,3,5,7,9};                //数组的声明和初始化

07              void Start()

08              {

09                        Debug.Log (“数组中的第1个数据是:” + myIntArray[0]);          //数组数据的引用

10                        Debug.Log (“数组中的第5个数据是:” + myIntArray[4]);          //数组数据的引用

11              }

12     }

运行游戏,在Console视图里查看脚本输出的信息,如图5-13所示。

 

图5-13  使用数组的示例循环遍历每个数据并做出判断大量数据的存储与引用C#游戏开发快速入门大学霸

2.列表

列表与数组类似,同样用于存储大量同类的数据。但是似乎C#开发人员相对于数组,更偏爱列表一些。除非逼不得已,否则他们不会从列表和数组二者间选择后者,基本上是因为下面的几个原因:

q  数组在被声明了以后,存储的数据的个数就是固定的了,而列表则比较灵活,没有这方面的限制,如果开发者需要,它还可以存储更多的数据;

q  列表可以更方便的增加和删除存储于其中的数据;

这次作者打算在演示一个示例以后,在具体介绍列表的声明和使用等等。为脚本MyScript添加下面的代码:

01     using UnityEngine;

02     using System.Collections.Generic;                                                                 //必须添加的语句

03

04     public class MyScript : MonoBehaviour

05     {

06              private List<int> myIntList = new List<int>();                                       //声明列表

07              void Start()

08              {

09                       myIntList.Add (1);                                                                               //添加数据到列表

10                       myIntList.Add (3);

11                       myIntList.Add (5);

12                        Debug.Log (“列表中总共存储的数据个数是:” + myIntList.Count);

13                        Debug.Log (“列表中第1个数据是:” + myIntList[0]);                 //引用列表中的数据

14                        Debug.Log (“列表中第3个数据是:” + myIntList[2]);

15

16                       myIntList.Add (7);

17                        Debug.Log (“列表中第4个数据是:” + myIntList[3]);

18              }

19     }

运行游戏,在Console视图里查看脚本输出的信息,如图5-14所示。

 

图5-14  使用列表的示例

q  脚本02行的语句,与以往不同,需要读者主动修改成这个样子,此语句是在脚本中使用列表的前提,顺便提及新建脚本时,语句是下面的这个样子:

02     using System.Collections;

q  脚本06行的语句如下:

06              private List<int> myIntList = new List<int>();                                       //声明列表

此语句声明了列表,其名为myIntList,目前还没有存储任何数据;和数组一样,声明列表时也需要指定指定列表中可以存储的数据的类型,本示例中存储的类型是int。

q  脚本09~11行编写了类似于下面的语句:

09                       myIntList.Add (1);                                                                               //添加数据到列表

通过这种方式,一个int类型的数据1,才被存储到了列表中。

q  脚本13、14行,引用列表数据的方式如下:

09                       myIntList[0]

单从编写样式上看,它的引用方式与数组引用自身数据的方式一模一样,而且它的下标也是从0开始,表示存储的第1个数据,其它数据的存储下标以此类推。

q  脚本16、17行,是列表区别于数组的使用方法,因为列表中可以存储的数据的个数是没有限定的;

3.字典

字典的使用方法与列表类似,但是它的声明需要指定一对数据类型,即键(Key)和值(Value)这两个数据的数据类型。使用字典最大的好处就是,可以通过Key,找到与之对应的Value。对于游戏的实际意义是,一个网络游戏一定需要存储大量用户的游戏信息,而游戏程序定位这些信息的方式通常是使用ID。也就是说,一个玩家就有一个ID,而ID关联了用户的所有信息,所以只要知道用户的ID,就不愁找不到玩家的其它游戏信息了。

在讲解字典的语法前,同样先演示一个示例,为脚本MyScript添加下面的代码:

01     using UnityEngine;

02     using System.Collections.Generic;

03

04     public class MyScript : MonoBehaviour

05     {

06              private Dictionary<int,string> myDic = new Dictionary<int,string>();              //声明字典

07              void Start()

08              {

09                       myDic.Add(10,”Monday”);                                   //添加数据到字典

10                       myDic.Add(20,”Tuesday”);

11                       myDic[30] = “Wednesday”;

12                        Debug.Log (“字典中总共存储的数据个数是:” + myDic.Count);

13                        Debug.Log (“字典中key为10的数据是:” + myDic[10]);                   //引用字典中的数据

14                        Debug.Log (“字典中key为20的数据是:” + myDic[20]);

15                       myDic[40] = “Thursday”;

16                        Debug.Log (“字典中key为40的数据:” + myDic[40]);

17              }

18     }

运行游戏,在Console视图里查看脚本输出的信息,如图5-15所示。

 

图5-15  使用字典的示例

q  脚本02行的语句,对于在脚本中使用字典同样是不可缺少的,

q  脚本06行的语句:

06              private Dictionary<int,string> myDic = new Dictionary<int,string>();

是字典的声明部分,从格式上来看与列表的声明方式十分相近。只不过声明字典需要同时指定键和值两个数据的数据类型。

q  脚本09~10行,为字典添加数据的方式与列表相似:

09                       myDic.Add(10,”Monday”);                                   //添加数据到字典

但是字典还有其它的方式,即脚本11行的代码

11                       myDic[30] = “Wednesday”;

这种方式,乍看之下与数组存储数据的方式一样,但是此种方式里,中括号“[ ]”里的数字可不是“下标”,而是“键”。

q  脚本13、14和16行,字典引用数据的形式与数组和列表一致,但是中括号“[ ]”里的数字可不是“下标”,而是“键”。

13                        myDic[10]循环遍历每个数据并做出判断大量数据的存储与引用C#游戏开发快速入门大学霸

Comments are closed.