一.前言
Unity3D是如今最火爆的游戏开发引擎,它可以让我们能轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型的互动内容。它支持2D/3D游戏开发,据不完全统计,目前国内80%的手机游戏都是用Unity3D开发。
由于Unity3D在开发过程中使用最多的是C# 语言,所以就要合理的使用C#提供的一些数据结构是非常有必要的,合理的选择数据结构可以加快开发速度,提高游戏运行性能,不合理的使用数据结构则会导致游戏运行性能降低,加大开发复杂程度!
先通过表格看看常用的数据结构:
C#常用数据结构 |
中文名 |
Array |
普通数组 |
ArrayList |
数组集合 |
List<T> |
泛型数组 |
LinkList<T> |
泛型链表 |
Stack |
栈 |
Queue |
队列 |
HashTable |
哈希表 |
Dictionary<K,T> |
字典 |
然后先大概了解这些数据结构的用法。
二.数据结构之间比较和部分使用案列
1.数组(Array)在一般的编程中较为常见,是最简单的数据结构之一,具有三个特点:数组存储的数据都是在连续的内存单元上,数组中的元素都是同一类型,数组可通过下标直接访问。缺点是数组是连续存储,在两个元素之间插入新的元素时很不方便,在创建数组时必须指定长度或初始化元素,就会面临溢出或内存浪费的问题。2.ArrayList就可以解决Array带来的一些缺点:无需指定大小或初始化元素。可以动态的插入数据元素,无需考虑溢出或浪费内存的事。ArrayList可以存储不同数据类型的原因是由于把所有类型都当作Object类型来处理,使用时很有可能会发生类型不匹配的问题,这也就说明ArrayList是类型不安全的数据结构,在频繁的进行读写(装箱拆箱)操作ArrayList的过程中会产生额外的开销,导致性能下降,所以在开发过程中使用ArrayList较少!
3.为了解决ArrayList不安全类型与装箱拆箱的缺点,List<T>作为一种新的数组类型引入,继承了ArrayList的一些优点,且确保了类型的安全,因无需进行装箱拆箱操作,因此List<T>是高性能的,所以List<T>在游戏开发过程中经常用到的数组类型。以下是List<T>的简单操作:
List<string> Lstr=new List<string>();
Lstr.Add(“元素一”); // 插入数据元素
Lstr[0]=“元素二”; // 修改数据元素
Lstr.RemoveAt(0); // 移除数据元素
在Unity3D游戏开发中,我们可以使用List<GameObject>来存储游戏对象,比如在射击游戏中的子弹,或角色扮演游戏中的NPC,都可以使用List<GameObject>进行存储。
4.LinkList<T>的特点是链中的每一个元素都指向下一个元素,这样救构成了一条链。在插入和删除某个数据元素时时间复杂度都为O(1)。
5.Stack(栈)的特点是先进后出。
6.Queue(队列)的特点是先进先出。
7.我通过游戏开发中的用法来介绍哈希表的使用和它的一些特点。在游戏开发过程中,我们通常会涉及到通过游戏角色的ID来正确匹配英雄角色,所以每个英雄角色都要有自己唯一的ID,每个英雄角色的ID和他们的角色名进行一一对应,那么,我们就可以使用哈希表进行存储这种数据,假设有如下信息:
序号 |
ID |
角色名称 |
1 |
2059 |
亚瑟 |
2 |
“2060” |
妲己 |
3 |
“ABC” |
后羿 |
4 |
2061.5 |
宫本武藏 |
使用哈希表存储的代码如下:
Hashtable Hero = new Hashtable (); // Hero.Add (key,value); Hero.Add (2059,"亚瑟"); //插入第1个元素 Hero.Add (“2060”,"妲己"); //插入第2个元素 Hero.Add (“ABC”,"后羿"); //插入第3个元素 Hero.Add (2061.5,"宫本武藏"); //插入第4个元素 // 通过key访问value if (Hero.ContainsKey (“2060”)) { Debug.Log ("该队伍中包含妲己"); } else { Debug.Log ("该队伍中不包含妲己"); }
通过以上的代码可以发现哈希表可以接收任意类型值作为key(key和value的类型都为object类型),其实这就体现出哈希表类型不安全。
8.为了解决哈希表类型不安全,我们可以使用Dictionary<K,T>来存储数据,可以将上面的代码改写成下面代码:
Dictionary<int ,string> Hero = new Dictionary<int, string> (); // Hero.Add (int key,string value); Hero.Add (2059,"亚瑟"); //插入第1个元素 Hero.Add (2060,"妲己"); //插入第2个元素 Hero.Add (2061,"后羿"); //插入第3个元素 Hero.Add (2062,"宫本武藏"); //插入第4个元素 // 通过 key(int)访问value(string) if (Hero.ContainsKey (2061)) { Debug.Log ("该队伍中包含后羿"); } else { Debug.Log ("该队伍中不包含后羿"); }
对比哈希表,字典保证了类型的安全,但世界上并不存在十全十美的东西,代码也是如此,字典通过空间换时间,通过更多的内存开销来满足对速度的追求。在创建字典时,可以传入一个字典容量值,但在实际使用时并非该值,而是使用不小于该值的最小质数最为它的实际容量,所以字典容量的最小值是3。且当有了实际容量后,并非直接实现索引,而是通过创建了两个额外的Array数组来实现间接的索引。面临的情况就是,即便创建了一个空的字典,伴随而来的是两个长度为3的数组。所以当处理的数据不多时,慎重使用字典。
三.总结
在游戏开发过程中,很多情况下使用普通数组也是可以的,数据结构的选取需要考虑数据的大小和使用场景才能合理的存储和处理该数据。优秀的程序员需要考虑机器运行的性能,合理的选择一些数据结构可以提高程序运行性能和降低开发复杂度。
以上知识点如果大家感觉可以学到东西,请分享给你的朋友们,感谢大家对小牛知识库的支持。
我想知道是否有人能帮我,我有一个游戏,电脑会随机生成一个4位数的代码,每个数字从0到5不等。然后用户猜出这段代码,计算机返回一个数组,我将其打印成字符串。数组中的每一个数字在正确的位置上都应该包含一个6,猜测中的每一个数字在正确的位置上都应该包含一个7,猜测中的每一个数字在正确的位置上都应该包含一个7,最后,对于任何完全不正确的数字都应该包含一个5。 例如,,如果代码是: 0143 并且用户的猜测
本文向大家介绍Unity3D开发实战之五子棋游戏,包括了Unity3D开发实战之五子棋游戏的使用技巧和注意事项,需要的朋友参考一下 前言 经过前面《Unity3D入门教程》系列讲解,再加上我们自己的探索,相信大家已经掌握了Unity3D的相关知识和基本方法。本文将使用前面学到的知识,开发一款简单的五子棋程序。本文用到的东西其实不多,非常简单。在最后我们会把完整工程的源代码发布出来,以供初学者参考。
本文向大家介绍C#在Unity游戏开发中进行多线程编程的方法,包括了C#在Unity游戏开发中进行多线程编程的方法的使用技巧和注意事项,需要的朋友参考一下 在这之前,有很多人在质疑Unity支不支持多线程,事实上Unity是支持多线程的。而提到多线程就要提到Unity非常常用的协程,然而协程并非真正的多线程。协程其实是等某个操作完成之后再执行后面的代码,或者说是控制代码在特定的时机执行。而多线程在
问题内容: 比较运算符的 “ Go编程语言规范”部分使我相信,仅包含可比较字段的结构应具有可比性: 如果结构的所有字段都是可比较的,则它们的值是可比较的。如果两个结构值对应的非空白字段相等,则它们相等。 这样,由于“ Student”结构中的所有字段都是可比较的,因此我希望编译以下代码: 但是,它无法使用以下消息进行编译: 无效的操作:alice> = carol(运算符> =未在结构上定义) 我
本文向大家介绍使用go实现常见的数据结构,包括了使用go实现常见的数据结构的使用技巧和注意事项,需要的朋友参考一下 1 golang常见数据结构实现 1.1 链表 举单链表的例子,双向链表同理只是多了pre指针。 定义单链表结构: 构造链表及打印链表: 1.2 可变数组 可变数组在各种语言中都非常常用,在golang中,可变数组语言本身已经实现,就是我们的切片slice。 1.3 栈和队列 1.3
本文向大家介绍Python编程中的Hangman游戏,包括了Python编程中的Hangman游戏的使用技巧和注意事项,需要的朋友参考一下 man子手是计算机上的著名游戏,它基本上将计算机生成的单词与您猜到的单词匹配。如果有比赛,您会得到奖励,否则游戏会继续要求新的输入。 在下面的游戏中,用户首先必须输入他们的姓名,然后要求其猜测任何字母。如果随机单词包含该字母,它将以正确的位置显示为输出,否则程