基于U3D的3D解密游戏设计与实现Word文件下载.docx
《基于U3D的3D解密游戏设计与实现Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于U3D的3D解密游戏设计与实现Word文件下载.docx(43页珍藏版)》请在冰豆网上搜索。
解密游戏从上世纪70年代就已经开始了,在当时缺乏图形界面下还是文本解密冒险的游戏,随着计算机科学技术和图像技术的发展,加上鼠标的普及带动了“pointandclick(点击)”类解密游戏的发展。
然而好景不长,这股解密游戏的大浪潮就退去了,衰落的原因有很多,其中一个重要原因就是传统的解密套路被挖掘得一干二净了,从而导致玩家出现了很严重的审美疲劳。
直到《行尸走肉》、《纪念碑谷》等新式解密玩法的出现才让这种游戏类型重新发展起来。
通过这段发展史的回顾,可以发现,西方的解密游戏一直向降低解密环节的难度发展。
归根结底,绝大多数解密游戏的玩家的乐趣更在于游戏里的其它元素,例如剧情、恐怖、探索等等,而并不都是冲着解密环节去玩的。
Unity3D是近几年非常流行的一个专业游戏开发引擎,不仅提供了充足的特性,还带有极其友好的可视化编辑器。
对设备的要求低且最多可以支持超过十个主流平台发布,大大降低开发时间。
因此不少游戏开发者选择U3D引擎,尤其在2019年移动端市场超过半数是U3D开发的,看得出市场需求量大,前景广阔。
因此本课题将基于U3D设计一款更加符合现代玩家的审美和体验的解密游戏,并对Unity游戏市场进行了解和技术的掌握,给玩家带来更多乐趣的同时希望能在未来游戏市场游刃有余。
一.2论文组织结构
第一章:
绪论,主要阐述了本课题的开发背景和意义,并且对国内外解密游戏的研究进行阐述。
第二章:
开发工具介绍,简要的介绍整个课题研究需要用到的主要软件,插件和Unity3D进行介绍,并且分析使用这些软件,插件的好处。
第三章:
对本课题研究开发的游戏进行设计介绍。
第四章:
游戏系统功能的设计与实现。
第五章:
对基于UGUI的界面设计与交互实现进行介绍。
第六章:
对游戏的进行测试,打包封装。
第七章:
对整个课题研究进行总结以及对未来游戏开发行业的期望。
第二章开发工具介绍
二.1Unity3D游戏引擎
二.1.1Unity3D引擎介绍
Unity3D是一个专业的跨平台游戏开发工具,是一个全面整合的专业游戏引擎。
截止2018年,该引擎已扩展支持超过25个平台,开发者无需进行太多的修改就可以一键发布在多个平台。
该引擎可用于创建三维(3D)、二维(2D)、虚拟现实(VR)和增强现实(AR)游戏,以及模拟和其他体验。
除开发游戏外,已经被很多其他行业所采用,例如电影、汽车、建筑和工程等行业。
主要编程语言为C#。
二.1.2Unity3D常用组件
组件(Component)就是将一些具有功能性的代码封装成一个类,当我们把这个组件挂载到游戏物体上,等同于对这个类进行实例化,变成了具有这个功能的对象实体,那么这个游戏物体也就具有了这个对象所具有的功能。
自己编写的脚本只要继承于MonoBehaviour基类也是一个组件。
以下是Unity3D提供的常用组件:
表格2.1.2常用组件
组件名
描述
Transform组件
游戏对象生成时自动附加的必带组件,用于控制其位置、旋转和缩放。
Collider组件
碰撞器,对游戏对象进行碰撞检测,以及实现碰撞的效果。
Collider组件针对形状需求不同有BoxCollider、MeshCollider和CapsuleCollider等等,开发者可以根据不同的形状需求进行选择。
AudioSource(音频源组件)
用于控制播放音频剪辑(AudioClip)资源,相当于一个音响。
ParticleSystem
(粒子系统组件)
粒子系统就是调味料,可以给乏味的游戏对象增添特别的“味道”。
粒子系统一般在预设的空间内的随机位置发射一定数量的粒子,可以具有方形或球形等形状,当设定的寿命到期时,系统会破坏粒子,再循环生成新的粒子。
二.1.3Unity3D的生命周期函数
Unity3D作为一个面向对象的游戏引擎,生命周期是Unity游戏开发的重要思想。
游戏中的每一个物体,脚本都是对象。
每一个对象都有它的生命周期,从产生到销毁,中间经历一些特殊事件、一些循环往复的事件。
MonoBehaviour类是Unity提供的一个基类,生命周期函数都是由这个基类设定好了,所以凡是继承了这个类的脚本都具有生命周期。
如表格2.1.3为比较常用的生命周期函数。
表格2.1.3生命周期函数
函数名
Awake
初始化函数,在脚本被实例化的时候就会被调用,不管脚本是不是enable,在整个生命周期只会被调用一次。
Start
在对象第一次enable之后进行调用,且只会被调用一次。
一般用作变量的赋值,初始化。
FixedUpdate
/Update
这两个事件在生命周期就像人的心跳,每一帧都会进行调用。
为固定时长,由于刚体的物理运动一般都与时间有关的,所以往往在FixedUpdate()中进行处理。
Update
每一帧都在调用,所以它和FPS的有关的,同一个Update()在60FPS和30FPS所执行的次数就不一样了。
受不同设备性能影响,同一个游戏在不同机器上效果不一样,有的快有的慢。
二.1.4UGUI(Unity官方图形用户界面组件)
UI设计是游戏设计中十分重要的一部分,好的UI不仅让界面更为舒适美观,还要让交互更为轻松自如。
本课题设计主要使用UGUI进行游戏界面以及交互的设计。
UGUI是Unity4.6以后推出的一套UI系统。
新的UGUI系统拥有直观的操作性,无需编写脚本就可以将UI元素放置在画面中。
[]前文说过Unity3D里每一个物体,每一个脚本都是对象,如无例外,UGUI系统的每一个UI元素都是游戏对象组成的。
同时我们可以通过脚本的编写对功能进一步扩展。
锚点(Anchors)功能是UGUI其中之一的重要布局功能,设定好各元素的AnchorPresets之后,游戏的UI界面就会在不同分辨率的设备下自适应调整。
相比于第三方的NGUI系统,UGUI作为后起之秀,虽然功能不够完善,但是与Unity更深度的集成。
同时,UGUI有着直观的操作性,自由的扩展性,灵活的布局自适应性,是开发者的不二选择。
二.2C#语言
C#是微软开发的一门语言,他们借鉴了Java中很多现代的编程特性,将其糅合到C++程序员所熟悉和习惯的语法当中。
[][p174]相比于被Unity所弃用的UnityScript和Boo语言,具备全部现代编程语言功能的C#语言要高级得多。
C#的这些特性:
托管类型:
托管代码的内存自动分配释放,程序员无需担心内存安全问题,更适合游戏的开发。
强类型:
强类型让代码编辑器可以进行实时的语法检查,同时强化了代码的自动补全功能,并基于前半部分的代码为后面提供正确的选项。
丰富的类库:
拥有丰富的直接面向游戏开发的库,避免了重复造轮子,大大加快开发效率。
使用C#语言开发非常贴切着Unity开发设定的目标,开发的壁垒也降低不少,是Unity游戏开发者首选的语言。
二.3JetBrainsRider2019.2
Rider是JetBrains公司开发的一款快速强大轻量的跨平台C#编辑器,相比于VisualStudio,Rider不仅使用流畅不卡顿,还与Unity集成了双向通信,无需离开编辑起即可开始、暂停、逐帧运行。
Rider还提供了2200多种实时代码检查,语法优化建议多,包括了Unity专用的代码检查和快速修复,有效的提高代码质量,所以本课题将在Rider上完成全部代码的编写。
二.4DOTween插件
DOTween是一款对Unity原生API进行扩展的面向对象的开源动画引擎。
不仅速度快,而且非常高效,动画以缓存的方式进行存储和重用,避免了不必要的内存的分配。
[]每一个动画都可以得到完全的控制,并且可以通过合并成序列创建一些复杂的动画。
使用DOTween基本上能满足各种动画需求,非常适合入门的游戏开发者。
二.5ProGrids插件
ProGrids可以让任何物体在移动的时候捕捉到世界栅格,帮助我们轻松的调整物体的准确位置和大小扩展的比例,使各个物体对齐且均匀的分布,大大提高了每个关卡场景的搭建效率。
二.6小结
本章节主要介绍了在游戏设计开发中所用的Unity引擎简要的介绍,以及介绍了其他软件以及插件的用处和优点,希望能给同类开发者在软件插件上的使用带来帮助。
第三章游戏关卡设计介绍
三.1游戏简介
游戏主角是一只精神小鸟,有着发光的脑袋和可爱的圆肚子,非常喜欢探险,在一次探险的时候掉进了神秘的机械世界,这里一个接连着一个的迷宫等着我们去解密。
本游戏是解密类冒险游戏,多种类型的迷宫,玩家需要改变机关激活路径,引导人物穿过迷宫顺利到达终点,通往下一关。
三.2游戏关卡设计
本游戏难度以循序渐进的方式设定,由易到难不会让玩家突然感到难度大增以至于动弹不得。
玩家一旦经常性的卡关,他们就会看攻略,看到攻略上的解法这么简单,感到羞辱的同时愈发怀疑人生了。
谜题设计是关卡最重要的部分,增加谜题元素的同时加上变化,让游戏不会太过单一而枯燥。
谜题可以通过独特的方式将游戏玩法和环境结合起来,并给玩家独特的回报,进而记得整个关卡,整个游戏。
[]解密游戏都是一周目游戏,一周目游戏的性质则决定了玩家必须在一周目的流程中获得足够长的沉浸体验,他才能觉得他购买的游戏值回票价,然后回去给游戏打个好评。
[]可知关卡的设计和策划是如此重要。
一般游戏都会有一定的新手引导,但对于解密游戏来说,关卡流程的本身就是教程,只需要告诉玩家如何进行操作就可以了,如图3.2.1本游戏的第一关卡以操作引导形式存在。
图3.2.1关卡一操作引导
如表格3.2,本游戏一共有十个关卡,有着不同类型的迷宫设计,迷宫的设计灵感大多源于生活,在其基础上再加以设计。
表格3.2关卡设计
关卡
游戏截图
设计说明
Level
2
难度:
★☆☆☆☆
在第一关过后,增加机关,进一步增添立体空间复杂度,起到渐进的作用。
3
★★☆☆☆
封闭的塔楼的设计,玩家需要观察外部知道内里的通道,不断爬升。
4
★★★☆☆
黑夜模式,让本不太难的关卡增添难度,考验玩家的观察力的同时考验玩家的在前三关的积累的经验。
5
双层迷宫的设计,考验玩家的逆向解密的思维以及进一步考验玩家的空间探索。
6
火山底部的主题,立体迷宫的设计,
7
这一个关卡设计灵感来源于暗箱,玩家需要从不同的视角观察暗箱内部的空隙,连通内部的路径。
8
镂空的塔楼,增添了关键的路径暗藏于内部,玩家需要找出才能走出迷宫。
9
双面迷宫的设计,玩家需要从两个面来回穿插走出迷宫。
10
★★★★☆
有别于关卡7的暗箱设计,此关需要从外部解出机关,考验玩家的观察和思维的突破。
三.3游戏美术设计
随着科学技术的发展,计算机硬件和软件技术水平飞速地提升,人们对游戏美术质量越来越重视,游戏美术设计的重要性也就逐渐凸显
在本游戏中,综合对本游戏玩法和场景需求考虑,确定了方块为主要的美术风格。
如表格3.2选取了较为精美的方块模型,搭建出不同主题的同时依然保持风格的统一,做好风格统一的把控有利于美术的设计方向不会偏移。
本游戏关卡的迷宫主题元素也是比较多样:
夏季、冬季、黑夜、金字塔、神庙、熔岩。
三.4小结
本章主要了对游戏进行简要的介绍,阐述了游戏关卡设计的重要性以及本游戏关卡设计的一些要点例如该类游戏教程的形式:
关卡本身就是流程。
列出了每一个关卡的截图、难度以及设计的灵感来源,以及对游戏美术设计质量以及风格统一的重要性。
第四章游戏实现
在游戏开发设计中,需要有它基本的游戏框架,让不同的功能结合使用。
由于Unity3D作为一款游戏引擎,已经为我们在硬件API之上搭建了一层基于组合的架构[]。
所以我们只需要根据游戏功能的需求搭建合理的游戏功能框架,在Unity3D原有组件的基础下编写额外所需的脚本,放入游戏物体中。
Unity3D中所有的物体就像一个容器,装载着不同的Components,拥有着不同的功能属性,使得这些物体拥有自己的行为。
如图4.1为本游戏脚本的类图。
图4.1游戏脚本类图
四.1寻路系统的实现
在现有的寻路系统中,AStar寻路是一种比较传统的人工智能算法,其原理并不复杂,不过由于不是Unity3D自带功能,因此在设定网格和烘培过程中难免会出现问题。
[]Unity3D自带的Navigation,均无法满足本游戏设计的需求设计。
于是便重新设计新的寻路系统,该寻路系统通过检测目标方块和人物当前方块之间是否具有连通性来进行寻路。
在开始创建寻路的系统之前,给人物可移动到的方块添加一个新的脚本Walkable.cs,添加一个GetWalkPoint()函数来设置可移动到的点,以及判断是否为阶梯进而来微调点的位置。
代码实现如下。
1.public
Vector3
GetWalkPoint()
{
2.
float
stair
=
isStair
?
stairOffset
:
0;
3.
return
transform.position
+
transform.up
*
walkPointOffset
-
transform.u
4.
p
stair;
5.}
为了决定人物在某个方块上能够移动的方向,新建一个GamePath类,包括了一个transform变量和一个布尔变量来检查这段路径是否被激活。
1.[System.Serializable]
2.public
class
WalkPath
public
Transform
target;
bool
active
true;
新建一个泛型为WalkPath类的列表,这样就可以可视化地设置每个方块的路径连通性。
1.public
List<
WalkPath>
possiblePaths
new
();
图4.1.1设置每个方块的连通性
通过OnDrawGizmos方法把连通的路径画出来,有利于我们在调试的时候找出问题,效果如图4.1.2。
代码如下:
1.private
void
OnDrawGizmos()
2.{
Gizmos.color
Color.gray;
.4f
5.
Gizmos.DrawSphere(GetWalkPoint(),
.1f);
6.
if
(possiblePaths
==
null)
7.
return;
8.
9.
foreach
(WalkPath
in
possiblePaths)
10.
11.
(p.target
12.
13.
p.active
Color.black
Color.clear;
14.
Gizmos.DrawLine(GetWalkPoint(),
p.target.GetComponent<
Walkable>
().GetWalkPoint());
15.
}
16.}
图4.1.2使用OnDrawGizmos效果图
给人物添加一个脚本PlayerController.cs,通过射线来检测人物当前所在方块的位置,并获得当前的方块信息。
RayCastDown()
Ray
playerRay
Ray(transform.GetChild(0).position,
-transform.up);
RaycastHit
playerHit;
(Physics.Raycast(playerRay,
out
playerHit))
currentCube
playerHit.transform;
8.}
通过摄像机发出的射线检测点击的方块信息。
1.if
(Input.GetMouseButtonDown
(1))
mouseRay
Camera.main.ScreenPointToRay(Input.mousePosition);
mouseHit;
(Physics.Raycast(mouseRay,
mouseHit))
(mouseHit.transform.GetComponent<
()
!
8.
clickedCube
mouseHit.transform;
10.}
图4.1.3寻路系统逻辑图
接下是寻路逻辑系统的开始,在FindPath()函数中,通过遍历查找人物所在方块的PossiblePaths,将激活的路径添加到nextCubes列表中,同时将当前所在的方块添加到pastCube