• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

C#开发Unity游戏教程循环遍历做出推断及Unity游戏演示样例

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

C#开发Unity游戏教程循环遍历做出推断及Unity游戏演示样例

Unity中循环遍历每一个数据,并做出推断

非常多时候。游戏在玩家做出推断以后。游戏程序会遍历玩家身上大量的所需数据,然后做出推断。即首先判定玩家是否有权限做出这样的选择。然后才决定是否为玩家运行此选择。比如。《仙剑奇侠传》这款游戏,进入剧情“荷叶迷宫时”,会要求玩家击碎迷宫里的5尊雕塑,如图5-12所看到的。可是击碎的前提是,玩家身上必须携带有“锤子”。

也就是说系统会遍历玩家身上全部的资源,假设有锤子才干击碎雕塑。


5-12  《仙剑奇侠传》,荷叶迷宫全图

推断是否有指定的数据,能够使用本章前面所学的if语句来解决。

可是眼下还存在两个其他的问题:

  • q  怎样在脚本中存储和引用这大量的数据。假设使用变量,显然要声明大量的变量。这样做显然不妥。

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

C#倒是提供了两种机制,能够非常有效的解决以上的两个问题,本节会逐个具体解释介绍它们。

Unity中大量数据的存储与引用

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

1.数组

数组能够存储大量同类型的数据。它的声明格式为:

  • 数据类型[ ] 数组名;

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

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

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

比如,以下的代码语句声明,而且初始化了数组:

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

读者应该能够从这条语句中看出,声明的是int类型的数组,数组名为myIntArray,存储了5int类型的数据,各自是13579

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

  • 数组名[下标];

  • 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  使用数组的演示样例

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  脚本1314行,引用列表数据的方式例如以下:

  • 09                       myIntList[0]

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

  • q  脚本1617行,是列表差别于数组的用法,由于列表中能够存储的数据的个数是没有限定的;

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 ("字典中key10的数据是:" + myDic[10]);                   //引用字典中的数据

  • 14                        Debug.Log ("字典中key20的数据是:" + myDic[20]);

  • 15                       myDic[40] = "Thursday";

  • 16                        Debug.Log ("字典中key40的数据:" + 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  脚本131416行。字典引用数据的形式与数组和列表一致。可是中括号“[ ]”里的数字可不是“下标”,而是“键”。

  • 13                        myDic[10]

Unity中遍历大量的数据

假设须要在脚本中使用相同的操作去一一判别大量的数据。C#倒是提供了一种不错的机制。读者也许会有兴趣,就是“循环”。C#里有3种用于实现循环的语句,各自是:foreachforwhile

本小节打算依次介绍它们的用法。最后再将这样的机制应用到游戏中。

1.foreach循环

为了更好的说明foreach循环的用法,以下将演示一个演示样例。此演示样例会使用foreach循环遍历数组、列表和字典里的全部数据。并使用if语句选择所需的数据。

MyScript脚本加入以下的代码:

  • 01     using UnityEngine;

  • 02     using System.Collections.Generic;

  • 03    

  • 04     public class MyScript : MonoBehaviour

  • 05     {

  • 06              void Start()

  • 07              {

  • 08                       string[] myArray = new string[] {"Monday","Tuesday","Wednessday"};

  • 09                       foreach(string myStrArray in myArray)                                        //循环遍历数组

  • 10                       {

  • 11                                 if(myStrArray == "Monday")

  • 12                                          Debug.Log("There is "+myStrArray+" in array.");

  • 13                       }

  • 14    

  • 15                       List<string> myList = new List<string> {"Monday","Tuesday","Wednessday"};

  • 16                       foreach(string myStrList in myList)                                              //循环遍历列表

  • 17                       {

  • 18                                 if(myStrList == "Tuesday")

  • 19                                          Debug.Log("There is "+myStrList+" in list.");

  • 20                       }

  • 21    

  • 22                       Dictionary<int,string> myDict = new Dictionary<int,string>

  • 23                                          {{10,"Monday"},{20,"Tuesday"},{30,"Wednessday"}};

  • 24                       foreach(KeyValuePair<int,string> myStrDic in myDict)          //循环遍历字典

  • 25                       {

  • 26                                 if(myStrDic.Key == 30)

  • 27                                          Debug.Log ("There is "+myStrDic.Value+" in dictionary");

  • 28                       }

  • 29              }

  • 30     }

执行游戏,在Console视图里查看脚本输出的信息。如图5-16所看到的。


5-16  使用foreach循环的演示样例

  • q  脚本081522行的代码。分别声明了数组、列表和字典。而且为它们初始化了3组数据;

  • q  脚本091624行的代码,则分别開始使用foreach语句遍历数组、列表和字典。

    09行的语句为例:

  • 09                       foreach(string myStrArray in myArray)                                        //循环遍历数组

foreach后括号“( )”里的语句,表示的含义是:要遍历的是myArray数组,而数组中的每一个数据都将先被存储于同类型的myStrArray变量中。语句的书写格式例如以下:


    鲜花

    握手

    雷人

    路过

    鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#依赖注入发布时间:2022-07-10
下一篇:
[转]在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(二) ...发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap