基于Unity3D的多视角悬浮岛生存冒险类游戏的设计与开发
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
内容摘要
随着近年来互联网技术的发展与进步,游戏产业也迎来了朝阳时期。
经过深入了解和研究生存冒险类游戏在市面上的情况,结合目前游戏市场的热点和玩家兴趣,本课题从多维度、多功能、多创新的方面出发,在开发过程中考虑后期开发需求,结合使用框架以及模块化思维的功能逻辑,解决开发后期可能会带来的开发隐患。
本项目通过UI部分结合其他部分进行开发。
UI部分结构清晰、层级明显,结合使用MiniMVC和PanelMgr面板管理系统,可以很好地解决游戏UI大框架上的结构问题;通过射线的检测功能,设计了一系列的检测机制,利用射线返回的信息反馈并结合FSM有限状态机控制AI的行为,模拟出Unity中的导航系统,有效提高AI导航设计的灵活度;并引入了ObjectPool 功能,利用ObjectPool统一管理游戏对象的内存分配,合理回收再利用游戏对象资源。
本项目基于游戏中出现的各种难题,通过研究和分析这些问题的特性,尽可能寻找出最佳的解决方案,实现游戏中各个模块的有机结合。
关键词:生存冒险沙盒游戏算法设计Unity3D 体素建模
.
Abstract
With the development and progress of Internet technology in recent years, the game industry has also ushered in a rising sun. After in-depth understanding and research of the survival and adventure games on the market, combined with the current hot spots in the game market and player interests, this topic starts from the multi-dimensional, multi-functional and multi-innovation aspects, and considers later development needs in the development process. Use the framework and the functional logic of modular thinking to solve the hidden development risks that may be brought later in the development.
This project is developed through the UI part in combination with other parts. The structure of the UI part is clear and the level is obvious. The combination of MiniMVC and PanelMgr panel management system can solve the structural problems on the game UI framework; through the ray detection function, a series of detection mechanisms are designed to use the information returned by the ray Feedback and combined with the FSM finite state machine to control the behavior of AI, simulate the navigation system in Unity, effectively improve the flexibility of AI navigation design; and introduce ObjectPool function, use
ObjectPool to uniformly manage the memory allocation of game objects, rationally recycle and reuse games Object resources.
This project is based on various problems that arise in the game. Through research and analysis of the characteristics of these problems, the best solution can be found as much as possible to achieve the organic combination of various modules in the game.
Key words:Survival adventure Sandbox game algorithm design Unity3D V oxel modeling
目录
第一章绪论 (1)
1.1选题意义与目的 (1)
1.2文献综述 (1)
1.3研究现状 (1)
1.4创新思路 (2)
第二章游戏功能与UI设计 (3)
2.1背包系统 (3)
2.1.1背包介绍 (3)
2.1.2物品选项 (3)
2.1.3物品拖拽 (4)
2.1.4物品信息 (4)
2.1.5 AI与建筑物背包 (4)
2.1.6背包UI布局与设计 (5)
2.1.7物品JSON数据 (5)
2.2物品合成系统 (7)
2.2.1物品合成系统介绍 (7)
2.2.2合成系统UI设计 (7)
2.2.3合成选项 (8)
2.3工具栏 (8)
2.3.1工具栏介绍 (8)
2.3.2工具栏UI设计 (9)
2.4物品操作提示 (9)
2.4.1物品操作提示介绍 (9)
2.4.2物品操作提示UI设计 (9)
2.5地图 (10)
2.5.1地图介绍 (10)
2.5.2地图功能 (10)
2.6菜单选项 (11)
2.6.1菜单选项介绍 (11)
2.6.2菜单选项功能 (11)
2.7面板管理器 (11)
2.8主角基本控制 (12)
2.8.1主角基本控制介绍 (12)
2.8.2基本控制 (12)
2.9建造模块 (13)
2.9.1建造模块介绍 (13)
2.9.2建造材料 (13)
2.10场景资源 (14)
2.11物理碰撞层级 (15)
2.12游戏按键汇总 (16)
第三章设计模式与核心算法 (18)
3.1 MiniMVC (18)
3.2 场景加载 (20)
3.2.1场景加载介绍 (20)
3.2.2异步加载 (20)
3.2.3异步加载实现 (20)
3.3 内存与对象池 (22)
3.3.1对象池介绍 (22)
3.3.2对象池实现 (22)
3.4 AI控制 (23)
3.4.1 FSM有限状态机 (23)
3.4.2 射线检测实现寻路和避障 (25)
3.5 接口与里式转换原则 (28)
3.5.1 接口与里式转换原则介绍 (28)
3.5.2 手部控制权 (28)
3.5.3 可交互物体 (29)
3.6 工具类 (30)
第四章游戏界面与环境展示 (32)
4.1 游戏主界面 (32)
4.2 加载界面 (32)
4.3 游戏地形 (33)
4.4 资源获取 (33)
4.5 UI面板 (33)
4.6 建筑物 (34)
结论 (35)
参考文献 (36)
致谢 (37)
第一章绪论
1.1选题意义与目的
选择该选题的目的主要有两大方面,一个是希望将自己在大学三年时间所学的知识尽量发挥出来,另一个是,在这个基础上,通过这个研究,学习更多的新知识,在这个选题当中,学过的与未学过的知识各占一半,很适合作为研究课题,要知道,如果把目标设定得太高,在选题研究过程中很容易因为受挫,导致自信心大受打击,以至于该研究后面的工作受到影响,但是,把选题设定得太过简单也不行,这样学不到什么知识,更说不上研究了。
综合考虑之后,设定了一个较为合理的难度,符合跳一跳,够得着。
在项目中模块设计实现过程中,我给自己加了一些限制,尽量使用设计模式去优化功能代码,提高代码利用率,为了提升自己的呈现开发能力,在项目中用到大量的框架与设计模式。
在程序员能力金字塔中,能力层次主要有三层,一是熟悉程序用法,能实现各种功能模块,但没有考虑程序的框架性和拓展性;二是在一的基础上,利用框架,设计模式等程序设计思想,提高代码质量,降低代码理解成本,为程序拓展性做好准备,在项目后期越做越简单。
三是计算机图形学,我自己也在努力往这边去努力,虽说在大学期间有相应的计算机图形学基础知识,但真正想了解到它的精髓,还需要大量时间和精力,学习很多数学与物理知识,会用到许多高深的数学与物理计算,本次课题也算是由二阶段到三的一个小过渡。
1.2文献综述
游戏中主要的控制方式是第一人称与第三人称控制,所以参考大量的第一人称游戏文献,特别是FPS类型的游戏,我本身也玩过不少的第一人称射击游戏,也算对该类型的游戏较为熟悉,大部分射击类游戏的操作控制方式大同小异,在现在的市场上算是很成熟的玩法,所以可以大量参考他们,来优化操作与手感体验。
选题中有网络模块,支持多人在局域网中进行联机,也是参考不少文献,了解主流做法,结合自己所学,输出最优方案。
在游戏玩法上,我采用的是生存冒险式的玩法,也就是说,玩家可能不会长时间呆在一个区域,通过不断探索未知领域,刺激玩家新鲜感,这里参考了冒险类与漫游类的游戏。
1.3研究现状
该研究分为三个阶段,前期功能制作阶段,中期功能调整及拓展阶段,后期
功能优化体验优化阶段。
目前研究处于中期阶段,选题中大部分的基本功能已经实现出来,因为该选题包含较多的模块,在开发前期,将其中各个功能分成具体的模块,这样做有什么好处呢?一是思路清晰,适合整理流程,游戏中涉及到大量的功能模块,如果不进行相应管理,不仅容易乱,而且不利于开发;二是用到程序开发的框架思想,设计模式,通过使用前人总结的经验,能快速梳理功能,将每个模块独立开,围绕具体的功能进行开发;三是主要的,也是最重要的目的,在程序设计中,有四大核心思想:高内聚,低耦合,易拓展,可移植,虽说是四大思想,其实他们之间相互联系,相互促进,是衡量一款程序设计项目重要评估标准,所以,在该选题中由大到小,细分了好几层,先是UI(2D)与3D,客户端与服务端,然后分场景,再分大模块,再到小模块,或许这样看起来貌似操作起来很繁琐,但对于一个比较大的项目来说,准备工作得做足,正所谓万丈高楼始于基石,为其不断添砖加瓦,像乐高积木一样,由部分到整体,慢慢呈现出来。
1.4创新思路
该选题主要的创新在于场景设置上,场景的大背景是天空,游戏场景主要发生在空岛上,这些空岛由于未知的能量波动,被推上天空,并且维持了相当长的一个时期,空岛悬浮于空中的主要原因是磁悬浮原理,主角为了探明空岛维持长时间悬浮的真相,前往各个空岛,了解空岛的内部构造和它与外部的相互作用。
为了增加游戏中的不确定性,会在里边加一些随机元素,类似现阶段热门的Roguelike类型的游戏,增加游戏新鲜感。
第二章游戏功能与UI设计
2.1背包系统
2.1.1背包介绍
背包用于放置并存储角色拥有的物品,可随时通过按键【I键】打开背包界面,查看自身所拥有的物品。
关闭背包的方式有两种:一是用过再次使用按键【I 键】关闭;二是通过退出键【Esc键】关闭背包。
背包存储物品的数量不限,且每个物品在同一物品格子中可无限叠加,大大增加物品存储的便利性,玩家无需担心背包溢出而导致一些物品无法及时存储起来。
2.1.2物品选项
物品最多有4中操作选项,可通过将鼠标悬停在对应物品上,使用【鼠标右键】打开该物品的操作选项。
这四种选项分别是:使用、转移、拆分和丢弃。
为了提高用户体验,在物品无法执行一些操作的时候将对应操作置为灰色,提醒玩家无法进行该项操作,否则正常状态显示。
除此之外,给常用的操作选项配置了相应的快捷键,鼠标悬停在某一物品上,按对应快捷键,可快速对该物品执行对应操作。
图2-1 物品选项
操作项快捷操作(快捷键)备注
2.1.3物品拖拽
转移物品:可通过鼠标左键拖动物品至其他有存储功能的背包上,如储物箱,这时相当于转移该物品至储物箱中。
放置至工具栏:许多物品需要放置至工具栏中才能使用,通过拖动物品放置至工具栏的槽中,以便对其进行使用。
如武器类型的物品:斧头,只有将其事先放到工具栏,然后再进行使用。
2.1.4物品信息
在玩家刚开始接触这个游戏时,并不对每个物品的作用十分了解,所以需要提供对应的信息给玩家,以便增加玩家对游戏物品的了解。
将鼠标悬停在某一物品上就会弹出信息小窗口。
物品信息包括:物品名称、物品描述和物品合成信息(物品合成所需材料、所需数量和已拥有的数量),只有可合成的物品有物品合成信息,如斧头这种,而像木头这种原材料无该信息。
物品信息窗口做了屏幕防超出处理,窗口默认显示在鼠标悬停左下方,当遇到右侧或下方显示空间不足时则会进行相应的显示位置改变,提高游戏体验[1]。
图2-2 物品提示信息
2.1.5 AI与建筑物背包
AI背包:不单单是主角才有背包,像游戏的动物也拥有自身的背包,玩家可通过靠近对方,使用按键【E键】即可打开对方背包,查看物品,或进行某些操作。
打开对方的同时默认会打开主角的背包,以便进行物品交换等操作。
关闭背包的方法同主角背包。
建筑物背包:储物箱或工作台等具备存储物品功能。
2.1.6背包UI布局与设计
背包共有两个,分为上下两处,上方为主角的背包,背包内的物品只存储主角拥有的物品。
下方为公共背包,除了主角以外,其他所有具备背包功能的物品展示都应用该公共背包。
公共背包默认隐藏,只有在打开对方背包时才会显示出来,并且在左侧标题位置显示其对方名称。
两个背包采取纵向排列,但由于受屏幕大小限制,如若平分两处背包大小,则显示的内容有限,且显得十分拥挤,所以这里采用了动态布局。
在两个背包设置了进出鼠标事件,检测当鼠标处于某一背包时,该背包所示内容变大,同时另一背包变小,这一过程采用动画平滑过渡,以免显得突兀。
采用该设计巧妙化解了屏幕空间不足的问题[2]。
背包内部采取格子布局,横向最多六个格子,纵向没有数量限制,当纵向物品数量超出则会在背包右侧自动显示滚动条。
图2-3 背包UI布局
2.1.7物品JSON数据
游戏中存在大量数据,而这些数据通常会保存成文件形式,在载入游戏时再从文件中加载进来,变为游戏数据。
在本文中,物品存储在*.txt文本文件中,文件内存储的格式严格按照JSON数据格式进行填写。
这样安排的好处是能够统一管理同种类型的数据项,不同类型的数据项存储在不同的文件中,方便后期的增加、删除以及修改数据项等操作。
以物品JSON数据文件为例,本文使用物品信息JSON数据文件(InventoryItemInfoJsonData.txt)存放所有关于游戏物品的信息。
文件中每条数据包含以下几种信息:ID、EName、Name、Info和Materials。
信息类型信息含义
ID 物品ID。
物品的唯一标识符。
EName 物品英文名称。
Name 物品中文名称。
Info 物品描述信息。
Materials 物品所需合成材料。
格式如下:物品1ID|物品1数量|物品2ID|物品2数量。
例如:1001|5|1002|8,则说明该物品所需合成物品
2.2物品合成系统
2.2.1物品合成系统介绍
玩家通过在游戏环境中获取物品原材料,然后再将其加工合成为所需物品。
目前可合成的物品有两大类,分别是建筑物与武器。
每种物品所需材料种类不同,不同材料所需数量也不同。
当合成物品所需材料齐全时,点击对应合成物品即可获得对应物品,并自动放置至主角背包中[3]。
2.2.2合成系统UI设计
从游戏隶属关系来说,合成系统依托于背包系统,可以说是背包系统的一部分,但由于物品合成系统有完整的结构框架,所以将其作为一个子模块看待,也能降低程序设计时的耦合度问题。
从UI设计来说,很多时候合成需要看当前所拥有的物品,是否能合成物品取决于是否有足够的合成材料,所以将合成物品的面板显示与背包并排,以便玩家能随时切换二者,查看对应信息。
图2-4 合成面板
2.2.3合成选项
合成物品在材料齐全的情况下可通过鼠标单击去合成单个物品,同时也设置了选项,鼠标右键单击可以呼出选项,选项包括合成一个、合成所有和合成目标数三种操作。
操作项备注
合成一个合成单个物品。
该操作与鼠标单击效果相同。
合成所有根据当前物品合成所需材料,合成最大数量。
合成上限由每个材料
所能合成数量的最小值决定。
合成目标数在当前材料可合成最大数量范围内,可合成任意数量该物品。
数量默认为最大数量的一半,可通过手动输入修改。
范围为[1, MAX],若手动输入数量溢出,则自动设置为最大数量。
2.3工具栏
2.3.1工具栏介绍
工具栏也是生存类游戏常见的基本功能之一,在游戏中,常常会有一些物品需要频繁使用,而工具栏就是为了这个而存在。
虽然说打开背包,再进行物品使用也是可以的,但这样操作的流程相对来说过于繁杂,不适合在游戏需要及时反馈的环境。
将物品放置到工具栏后可通过快捷键【键盘数字键1~8】使用所在格子的物
品,一些物品无法在背包中直接使用,只有在工具栏中时才能使用,如建筑物品和武器等。
在所在格子激活状态下,再次使用其对应快捷键即可取消使用,恢复至空手状态。
2.3.2工具栏UI设计
工具栏整体位于屏幕中下侧,玩家能随时看到工具栏所放置好的物品,并通过对应快捷键进行使用与否。
工具栏共有8个格子,配合键盘数字键1~8进行使用。
格子左上角已注明对应数字快捷按键。
图2-5 工具栏
2.4物品操作提示
2.4.1物品操作提示介绍
物品操作提示是为了玩家能够在对物品进行操作时能看到对应的信息反馈,不至于用了物品之后不知道物品是否发挥了作用。
操作提示共有三种,分别是获得,使用以及移除,玩家可以在左下角看到自己操作的结果,确认效果反馈。
2.4.2物品操作提示UI设计
该提示整体位于屏幕左侧偏下位置,与信息滚动列表类似,信息由下往上进行填充,每条信息一般情况下默认停留几秒时间,然后消失。
在信息重复的时候,信息会进行叠加处理,如第一次获得100木头,在信息停留时间内,如若再次获取200木头,则信息会变成获得300木头,节省信息提示数量。
信息叠加的条件是同类信息且同类物品。
类型有三种,获得、使用与移除,也就是对同类物品进行同样操作,且时间间隔较小,则信息会进行叠加处理,叠加时信息停留时间刷新。
每条信息拥有三个信息,从左往右分别是:操作类型、物品图标以及乘号【x】+物品操作数量。
为了区分不同操作,为操作赋予不同的颜色,获得为绿色,使用为蓝色,移除为白色。
玩家熟悉之后即可通过颜色快速区分不同操作类型,而不必仔细去分辨,提高玩家游戏体验。
图2-6 物品操作提示
2.5地图
2.5.1地图介绍
地图是RPG类型游戏常见的功能之一,从大的方面的来讲,地图能让玩家对游戏场景环境有一个整体的了解,通过查看地形等高线,初步判断出整个的游戏场景的基本框架以及基本布局。
对于经常玩这类游戏的玩家来说,他们对不同地形所具备的资源,地形地况以及有了一定的理解,就可以通过环境的情况快速推理出哪些地方可能会有自己想要的资源,或者寻找一个适合长期居住的地方,驻扎修整。
从而在游戏中获得主导权和主动权,发展自己的各项能力,快速融入进游戏当中[4]。
打开地图的快捷键为【M键】,关闭时可用【M键】或【Esc键】关闭地图。
2.5.2地图功能
除了介绍中所提及的一些基本功能之外,还给地图额外增加了一些辅助功能。
缩放功能:通过鼠标滚轮,可对地图进行放大放小处理。
放小地图可对地图有一个整体的认识,方便对游戏有整体的节奏把控,放大能在整体的基础上,对其中一些细节进行特殊分析。
这项功能使用得当能为玩家对游戏理解提高不小的帮助。
拖拽滑动功能:用鼠标左键可拖动地图,配合缩放功能查看地图。
已对拖拽边缘进行限制处理,以免玩家过度操作。
标记功能:打开地图,地图中会默认标记主角当前所处位置,以便玩家了解自身在游戏中的方位,判断下一步应该往哪个方向行进。
除此之外,还提供手动标记功能,移动鼠标至地图中任意某一地点,右键进行标记处理。
为玩家提供了四种标记图标,分别有一个家的图标和三个普通图标(区别于标记自身图标)。
可输入标记名称或留空皆可,最后选择保存或取消标记。
标记过的位置可将鼠标悬停至该位置,查看标记名称以及位置信息,手动标记的位置如若不用,也可进行删除(默认标记自身位置无法删除)。
标记的数量不限,玩家可任意添加。
标记过的位置无法进行二次编辑,如若玩家想修改对应信息,需要删除旧标记,在相同位置重新添加标记。
图2-7 地图
2.6菜单选项
2.6.1菜单选项介绍
菜单选项是游戏中一些涉及整体操作的内容。
打开菜单选项的快捷键为【Esc 键】,关闭方式有两种,一是再次按【Esc键】,二是在菜单选项中选择继续按钮。
打开菜单选项时,游戏世界时间静止,可用于暂停游戏,关闭则恢复正常游戏时间。
2.6.2菜单选项功能
继续(按钮):关闭菜单选项,继续游戏。
自杀(按钮):设置该选项出于三点理由,一是出于娱乐,玩家偶尔可以自杀,也算是游戏的特色玩法之一;二是可以进行快速回家或者传送,玩家的死亡后重生地点是固定的,若玩家将家建在重生地点附近,就可通过该机制快速回家。
或者是出于某种需求,需要快速到达重生点附近,也可使用该方法快速到达;三是逃脱困境或测试作用,尽管游戏中考虑了玩家各种可抵达的区域和位置,难免会有考虑不到的可行走区域,导致玩家无法离开该区域,游戏场景中设置有裂谷环境,在某些区域超出玩家跳跃能力,如若玩家没有携带可上升的建筑物,则会
困在其中,这时可用自杀逃离。
回档(按钮):游戏设置有存档功能,但只能回到上一次存档,在理想情况下可在两个存档中无限进行回档操作。
设置(按钮):进行游戏的一些基本设置。
退出(按钮):退出游戏(在Unity3D编辑器中使用则是退出游戏运行)。
图2-8 菜单选项
2.7面板管理器
面板管理器在游戏中十分常见,用于统一管理所有的面板,所有的游戏UI 元素,如背包,工具栏,准星,提示信息等。
面板管理器将所有UI元素分为三大类,分别是固定面板、可开关面板以及提示信息,每一类共同归属为一层,也就是三层UI,显示顺序由后往前是:固定面板层->可开关面板层->提示信息层,也就是在三层UI都有面板的情况下,可开关面板会遮挡固定面板,提示信息会遮挡可开关面板。
固定面板层:该层的UI一旦显示,则会一直保持显示状态,不会隐藏或者关闭。
如:工具栏,准星等UI,在游戏过程中能一直看到,且不会被关闭。
可开关面板层:顾名思义,打开的面板可以进行关闭,大多为玩家主动打开的面板。
如背包、合成面板以及地图等面板,可手动选择打开或关闭面板。
这一层是比较特别的一层,在同一时刻内,只允许0或1个面板处于打开状态。
如若当前打开了一个面板,在不关闭当前面板的情况下,打开另一面板的话,会首先关闭当前打开的面板,再打开另一面板。
如当前若已打开背包,然后再打开地图,则在逻辑上背包会先被关闭,然后再执行打开地图的逻辑。
提示信息层:最靠前的一层,所有属于提示信息的内容都会显示在最上面一
层,避免提示信息被其他内容遮挡,起到及时提醒玩家的作用。
图2-9 面板层级
2.8主角基本控制
2.8.1主角基本控制介绍
主角默认为第一人称视角,玩家通过控制我们的角色模型在场景中进行各项
活动[5]。
2.8.2基本控制
控制项按键备注
移动
【W、A、S、D键】/【W、
A、S、D键】+【Shift键】
通过键盘按键【W、A、S、
D键】进行前后左右移动。
可通过【W、A、S、D键】
+【Shift键】进行快速奔跑。
视角滑动鼠标
通过滑动鼠标控制当前角色
朝向以及视角俯仰角。
最大
俯角80度,最大仰角35度。
跳跃【Space键(空格键)】
往高处跃起,配合移动使用,
可控制跳跃距离远近。
2.9建造模块
2.9.1建造模块介绍
游戏中提供了多种建筑材料,在表2-2中序号4~13中列举了游戏中可使用
的建筑物品,这些建筑提供积木式的搭建支持,每种建筑材料都有严格的大小要
求,使其能够相互之间完美契合[6]。
玩家可以根据建筑的特性,加上自身对建筑的理解,只要稍加心思,就能建
筑出自己满意的房子来。
建筑物最主要的作用是给玩家提供一个稳定的居所,为玩家生存立下安全保障。
一个好的建筑不单单只是房子的作用,同样可以是哨站,可以临时庇护所,可以是仓库,甚至可以作为捕捉猎物的陷阱,只要玩家充分发挥想象力,一定能够创造出更多的用途来。
2.9.2建造材料
每种建筑材料都有自身的特性和使用条件。
使用建筑材料时需要将其先拖放到工具栏槽位中,再按对应快捷键进行使用,使用时建筑材料会进入预览阶段,当建筑材料符合放置要求时,建材会显示为绿色,否则为红色,代表无法放置。
在预览阶段,玩家可通过控制角色位置与朝向间接控制建材的摆放,当位置合适时单击鼠标即可放置建材。
若预览时不想继续放置,可通过两种方式退出放置:①再次使用槽位快捷键;②使用鼠标右键取消放置。
放置成功后若槽位中还有剩余建材则默认继续进行放置,直到没有或主动取消放置。
2.10场景资源
游戏场景中遍布着各种动植物以及矿石之类的资源,无论是游戏前期还是后期,资源始终贯穿于游戏之中。
要想在游戏中很好地生存下来,收集地图中各种资源是玩家的必经之路。
在游戏中通过采集、猎杀动物获取这些资源,并利用这些原材料制作强力的辅助工具,能提高自己的生产效率。
当角色不再为原材料担。