基于Unity3D的3D横版沙盒游戏的开发与实现.docx

上传人:封****n 文档编号:96762526 上传时间:2024-03-19 格式:DOCX 页数:44 大小:1.70MB
返回 下载 相关 举报
基于Unity3D的3D横版沙盒游戏的开发与实现.docx_第1页
第1页 / 共44页
基于Unity3D的3D横版沙盒游戏的开发与实现.docx_第2页
第2页 / 共44页
点击查看更多>>
资源描述

《基于Unity3D的3D横版沙盒游戏的开发与实现.docx》由会员分享,可在线阅读,更多相关《基于Unity3D的3D横版沙盒游戏的开发与实现.docx(44页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、摘要在二十一世纪的现在,据第一个电子游戏的出现已经过了60年以上,在这期间随着科技的迅速发展,电子游戏的技术也得到了迅速的发展,游戏的内容和类型开始变得多样。游戏的自由度越高时游戏类型就越接近类似沙盒游戏的游戏类型。沙盒游戏能够包含格斗、射击、驾驶、养成以及冒险等多种不同的游戏要素。沙盒游戏的高自由度甚至可以创造或者毁灭整个游戏世界。目前个人认为最成功的沙盒游戏分别是3D的我的世界和2D的泰拉瑞亚,二者凭借广阔的世界,丰富的游戏因素和极高的自由度吸引了大批玩家来到沙盒世界建造属于自己的世界。本论文是基于Unity3D探索横版的3D沙盒游戏的开发与实现,既实现2.5D的沙盒游戏。游戏的设计方向是

2、实现一般沙盒游戏拥有的游戏元素,着重在于沙盒世界的地图的随机生成,横版下的建造模块的探索。关键词:Unity3D 沙盒游戏 2.5D游戏 随机地图Abstract In the 21st century, more than 60 years have passed since the first video game appeared. During this period, with the rapid development of technology, the technology of video games has also been rapidly developed, and

3、the content and genre of the game have begun. Become diverse. The higher the degree of freedom of the game, the closer the game type is to a game type similar to a sandbox game. Sandbox games can contain many different game elements such as fighting, shooting, driving, training and adventure. The hi

4、gh degree of freedom of sandbox games can even create or destroy the entire game world. At present, I personally think that the most successful sandbox games are 3D My World and 2D Terraria. The two have attracted a large number of players with their vast world, rich game factors and extremely high

5、degrees of freedom. Go to the sandbox world to build your own world.This paper is based on the development and implementation of the 3D sandbox game of Unity3D exploration horizontal version, which is the realization of 2.5D sandbox game. The design direction of the game is to realize the game eleme

6、nts owned by general sandbox games, focusing on the automatic generation of maps in the sandbox world and the exploration of construction modules under the plane.Key words: Unity3D Sandbox game 2.5D game Random map广东东软学院本科生毕业设计(论文)目录1绪论11.1开发背景及意义11.2本文内容安排11.3课题的研究内容与重点12游戏开发原理22.1 游戏引擎介绍22.2 C#介绍2

7、2.3 系统开发运行环境23游戏需求分析33.1游戏基本介绍33.2需求分析34游戏设计与实现44.1 UI界面44.1.1 UI介绍54.1.3血条&蓝条74.1.4齿轮UI74.2地图84.2.1地图生成84.3玩家184.3.1 玩家设计184.3.2 玩家物理效果194.3.3 玩家动画204.3.4 玩家移动214.4助手224.5敌人294.5.1敌人简介294.5.2敌人功能的实现294.6传送通道334.7 相机344.8保存机制354.8.1保存354.8.2加载365总结385.1本文总结38参 考 文 献39致谢401绪论1.1开发背景及意义科技的日新月异,带动了游戏相关

8、产业的技术升级,动作、冒险、休闲以及新出的沙盒和VR等各种各样的游戏类型迎来了进一步的发展。而在人们背负着众多压力的生活中,游戏无疑成了背负众多压力的人的一种暂时释放压力与增添生活趣味的途径之一。之所以选择沙盒游戏,是沙盒游戏足够大的世界可以保证不同的游戏元素可以实现,而且现在热门的3D沙盒游戏是Minecraft而2D沙盒游戏是Terraria,这些游戏里不仅有冒险,丰富的道具,怪物以及一些电路之类的系统,大大增加了游戏的可玩性。3D游戏比2D游戏在模型、代入感等上面有不可比拟的优势,但在游戏的休闲性和趣味性上我更偏向terraria,横版的画面能让玩家清楚的知道周围的情况,能减轻紧张的情绪

9、,而且特效效果能变得直观。3D横版沙盒游戏以冒险,休闲,经营为主。选择用unity3d做3D横版沙盒游戏是想要将2D游戏3D化同时保留2D游戏的特色。在游戏中不设置生命数量,死亡不再是游戏的终点,玩家里可以按自己现实生活中的节奏来选择游戏的退出和继续。游戏以探索未知为主并且没有日常式任务,不需要长时间进行游玩,可以随时随地保存并退出游戏。本次课题的主要的目标是为了探索3D横版沙盒游戏的开发提供基础理论经验,将以代码编程为主,创造一个基础的横版沙盒游戏世界。1.2本文内容安排第一章说明本次课题的意义,探讨项目的开发背景以及未来前景,以及项目内容的相关介绍。第二章简要说明项目运行的环境配置、所使用

10、工具。第三章说明沙盒游戏的市场前景以及项目中的游戏大致玩法介绍第四章着重于项目中每一个功能的实现原理,代码编写以及功能的详细说明。第五章总结项目制作过程中的收获。 1.3课题的研究内容与重点本课题的研究是开发一个基于unity3D的横版沙盒游戏,利用C#编写包括随机的地图生成,敌人角色生成,探索,战斗,建造及保存玩家在游戏内活动的内容等相关游戏内容的实现。课题的重点在于沙盒游戏里可编辑性地图的研究,横版玩法下角色的控制方法,物体放置的实现,以及最终的UI界面设计。122游戏开发原理2.1 游戏引擎介绍 本次使用的游戏引擎是Unity3D个人版,一款非常适合新手初次使用并且免费的游戏引擎,Uni

11、ty3D对个人开发者来说是有着低廉的成本,而且相关的代码编写及操作简单,直观,容易入门。编程语言虽然支持C#、javascript、boo三种脚本语言,但由于官方的编程语言是C#,建议直接使用C#即可。同时还自带官方的AssetStore,里面提供了大量用于开发的插件和资源,其中有不少官方提供的免费素材及插件。在界面编辑点击书本符号会跳转到当前插件的的Unity3D手册,Unity3D手册提供了几乎每一个插件的介绍,参数介绍,使用条件。在Unity3D里进行工作的时候,工作项目的调试也非常简单,保存好编写的内容就可以在视窗界面点击Play进行运行,并且Unity3D导出的游戏能应对Window

12、s、Mac OS、iOS、Android、Linux等多种平台进行兼容。2.2 C#介绍 C#是微软公司发布的一种运行于.NET Framework上的计算机编程语言。C#是Unity3D的官方编程语言,C#本身不是一种跨平台的编程语言,但由于Mono的桥接使得在Unity3D上可以使用C#这种语法明了,类库使用简单的语言。2.3 系统开发运行环境系统环境操作系统:Windows10家庭中文版(64位)开发工具:Unity3D(Unity 2018.3.8f1 Personal)处理器:Intel(R)Core(TM) i7-6700HQ CPU2.60GHz 2.59GHzC#编辑器:Vis

13、ualStudio20173游戏需求分析3.1游戏基本介绍开始游戏时,在UI动画结束后,玩家出现在一片废弃区域的传送通道,玩家可以自由改造初始的废弃区域,玩家可以通过传送通道去往其它随机生成的地图上,应付当地的防御机制获取在初始区域建造物品的资源。 游戏中没有真实意义上的游戏结束,在玩家的生命归零后会播放玩家倒地动画,在初始地图复活,所有的随机地图在探索结束离开后都会消失。3.2需求分析 当今快节奏的社会中,大多数人的吃穿住行等最基础的物质上的需求基本得到了满足,人们开始更多的寻求精神上的需求。书籍、游戏、电影和动漫这类的精神上的需求得到了大多数人的欢迎。游戏更是被人们广泛接受的文化之一。在如

14、今快节奏的生活中,人们或许在忙碌之余想静静的放松并暂时忘记现实世界的烦恼的时候,沙盒游戏是不错的选择。在沙盒游戏中,游戏世界会基于一定的模板生成一个相对随机的世界,来到这个游戏世界的玩家拥有最大自由度去选择如何在这个虚拟的世界生活,并且可以随时保存并结束游戏投身到现实生活中去。4游戏设计与实现4.1 UI界面游戏的菜单界面以简洁明了为主,基本上采用了黑白设计并添加动画控制消失和出现以便于在观感上变得平滑,如图1左右两边的形状分别对应着退出游戏和重新开始游戏,中间的齿轮可以触发菜单的关闭动画,下方的秒表图案用来保存游戏,左下方音量标志控制游戏声音的有无,另一边的是游戏的操作说明。图4-2是开始游

15、玩时的界面,红色的机器人图标代表Player的生命值,蓝色的代表能量,蓝齿轮表示目前已有的资源数量。右下方的齿轮组会在建造模式下从下方移动到当前位置,每个齿轮代表可以制造的物体,齿轮的右下角代表当前可造数量。图1菜单界面图2游戏界面4.1.1 UI介绍Unity3D的UI制作是非常方便的,在窗口Hierarchy空白处右键UIPanel即可在Hierarchy窗口自动创建Canvas和EventSystem并在Canvas里生成Panel,EventSystem在Hierarchy窗口里基本只能有一个,创建的UI基本都是Canvas的子节点。UI的基本类型有image、Text、Button、

16、Panel、Solid等多种类型。4.1.2主界面UI制作主界面UI主的制作主要使用了Unity3D自带的Button组件,Image组件和Animator组件来制作。完成图1菜单画面的基础布置后,可以考虑加入Animator制作一些简单的UI动画。在Canvas里将相关的UI放到同一个父节点“Closing”下面,之后在父节点的组件里通过Add Component添加Animator组件。之后再根据自己的创意制作动画。全程除了Button的On Click()事件要写些相关代码外都可以在编辑界面完成。Button按钮相关代码using UnityEngine.SceneManagement;

17、 public void RestScene1() /当前场景重新加载 SceneManager.LoadScene(SceneManager.GetActiveScene().name); public void GameQuit()/退出游戏 Application.Quit(); public void ClosingEnd() /关闭UI if (!Player_control.player_Control.isDie) anim.SetBool(ClosingStarid, false); anim.SetBool(ClosingEndid, true); 主要是通过将初始的保存地图

18、的二维数组清空,遍历每一个初始场景的物体创建时的信息再保存。public void MainMapSave() /保存初始地图 MainMapGrid = new intmapsize, mapsize; if (gamemap5.childCount != 0) for (int i = 0; i gamemap5.childCount; i+) int _x = gamemap5.GetChild(i).GetComponent().x; int _y = gamemap5.GetChild(i).GetComponent().y; MainMapGrid_x, _y = 1; for (

19、int i = 0; i gamemap7.childCount; i+) int _x = gamemap7.GetChild(i).GetComponent().x; int _y = gamemap7.GetChild(i).GetComponent().y; MainMapGrid_x, _y = 5; Debug.Log(主地图保存); 4.1.3血条&蓝条 图3中显示的机器人图像的红蓝UI分别是生命值和能量值主要是应用UI组件Image完成。组件Image中参数设置ImageTypeFilled,FillMethodVertical 之后就可以通过调节FillAmount的值实现血

20、蓝条的增减,如图3。FillAmount的值最小为0最大为1,可以通过将当前的生命值除去最大的生命值来获得FillAmount的值。比如FillAmount = 角色当前的数值/角色最大生命值。图34.1.4齿轮UI蓝色齿轮表示游戏中玩家获取的资源量,主要是通过击碎水晶来增加。资源数量是通过Text组件里的Text来显示,代码上通过获取Text组件“BaseCount”之后再将int类型的资源数量“Counter”转换成类型string,代码如下BaseCount.text = GM.gM.Counter.ToString(0);白色齿轮用来直观表示当前选择要建造的物体和能够建造的数量。4.2

21、地图4.2.1地图生成地图采用二维数组来实现,先通过Random.Range(int min,int max)随机生成一个40*40的由0和1组成的二维数组int,,之后再通过填补和删除逐渐得到想要的效果,之后再根据二维数组的值生成物体,并将每个物体放进物体数组GameObject,,这样基本可以实现基本的物体删除和创建,在地图数组生成后经过填补,删除完成之后遍历数组查找能够添加水晶的位置接着按照二维数组创建游戏地图。如初始地图4。图副本随机地图5。二维地图生成代码如下using UnityEngine;public class CreateTerrain : MonoBehaviour pu

22、blic static CreateTerrain createTerrain; public GameObject rock; /保存生成的两种水晶类型 public GameObject crystalsv; /生成地图位置 public Transform gamemap; /传送通道 public GameObject JumpTuunnel; /数组大小 public int mapsize = 40; /副本地图二维数组 public int, mapgrid; /主地图数组 public int, MainMapGrid; /副本地图生成的物体池 public GameObjec

23、t, objgrid; /主地图生成的物体池 public GameObject, Mainobjgrid; void Update() /判断是否需要调用主地图 CreateMainMap();检测随机副本的数组是否被清空,如果被清空则会开始销毁随机副本,并生成新的随机副本地图,一般在玩家离开随机地图后调用。 if (mapgrid = null) if (gamemap0.childCount != 0) for (int i = 0; i gamemap0.childCount; i+) Destroy(gamemap0.GetChild(0); CreateMap(gamemap0,g

24、amemap1); /创建地图 CreateMap()主要用来生成随机地图,两个参数分别代表生成的岩石和水晶的父节点。该函数调用的时候会检测随机副本地图是否是空数组,不是则直接调用生成地图函数CreateMap_execute(),是的情况下则会重新生成新的随机副本地图数组,经过多次ResetMap_del()和ResetMap_fill()的删补后ResetMap_delone()消除孤立的个体CreateCrystalsv()则会寻找数组地图上满足生成水晶条件的位置并概率生成,Createtunnel()负责在数组地图基本成型的时候封边之前找出传送通道的位置,之后执行生成函数CreateM

25、ap_execute()。二维数组地图生成函数CreateMapGrid(int, mapgrid),该函数通过for循环和随机数生成大致的二维数组模型,之后通过函数RestMap_del()删除,函数RestMap_fill()填充,函数RestMap_delone删除孤立点,完成基本框架,之后遍历数组添加水晶敌人和传送通道位置。void CreateMapGrid(int, mapgrid) for (int i = 0; i mapsize; i+) for (int j = 0; j = 40) mapgridi, j = 1; else mapgridi, j = 0; /优化地图

26、ResetMap_del(mapgrid); ResetMap_fill(mapgrid); ResetMap_del(mapgrid); ResetMap_delone(mapgrid); /生成水晶 CreateCrystalsv(mapgrid); /生成传送门 Createtunnel(mapgrid); /封边 for (int i = 0; i mapsize; i+) if (mapgrid0, i = 0) mapgrid0, i = 1; if (mapgridi, 0 = 0) mapgridi, 0 = 1; if (mapgridi,mapsize - 1 = 0) m

27、apgridi, mapsize - 1 = 1; if (mapgridmapsize - 1,i = 0) mapgridmapsize - 1, i = 1; 传送通道的位置生成是通过不断随机出地图数组中一个当前位子没有其它物体的坐标(x,y)符合条件后开始判断在数组中(x-2,y)+(x+2,y)+(x,y-2)+(x,y+2)值的和为零的情况下生成传送通道并将坐标(x,y)为中心的3*3的九宫格,除坐标外其他坐标的值变更为-1,变成不可使用区域,不等于零的情况下在开始下一轮的随机,直到找到符合条件的位置循环结束。 /挑选位置生成传送门 void Createtunnel() int

28、_x; int _y; for (int i = 0; i i + 1; i+) _x = Random.Range(2, 38); _y = Random.Range(2, 38); if (mapgrid_x, _y = 0) int _sum = mapgrid_x - 2, _y + mapgrid_x + 2, _y + mapgrid_x, _y - 2 + mapgrid_x, _y + 2; if (_sum = 0) for (int k = _x - 2; k _x + 3; k+) for (int l = _y - 2; l _y + 3; l+) mapgridk,

29、l = -1; mapgrid_x, _y = 4; break; /生成主地图函数CreateMainMap()主要负责在场景里按照主地图的二维数组创建对应的主地图,由于主地图和副本地图同样在同一个Scene里,在生成完物体后变动主地图父节点位置以防和副本地图位置重合。 public void CreateMainMap() /如果未生成主地图 if (gamemap5.childCount = 0) /判断主地图数组是否为空 if (MainMapGrid.Length != 0) /生成地图 CreateMap_execute(MainMapGrid, Mainobjgrid, game

30、map5,gamemap6); gamemap5.position = new Vector3(0, 70, 0); gamemap6.position = new Vector3(0, 70, 0); gamemap7.position = new Vector3(0, 70, 0); /地形生成CreateMap_execute()负责通过数组遍历数组里的值在场景里生成数组地形。这里是后期要重点改进的地方,如果游戏中的可生成物体越多这里编写的代码便会越越多越显的臃肿,不利于后期的代码维护。 for (int i = 0; i mapsize; i+) for (int j = 0; j m

31、apsize; j+) switch (_mapgridi, j) /地形框架 case 1: _objgridi, j = Instantiate(rock, new Vector3(i, j, 0), Quaternion.identity, _rocktr); _objgridi, j.GetComponent().x = i; _objgridi, j.GetComponent().y = j; break; /攻击型水晶 case 2: /向右 if (_mapgridi + 1, j = 1) _objgridi, j = Instantiate(crystalsv0, new V

32、ector3(i, j, 0), Quaternion.Euler(0f, 0f, 90f), _crytr); _objgridi, j.GetComponent().cryX = i; _objgridi, j.GetComponent().cryY = j; continue; /向左 if (_mapgridi - 1, j = 1) _objgridi, j = Instantiate(crystalsv0, new Vector3(i, j, 0), Quaternion.Euler(0f, 0f, -90f), _crytr); _objgridi, j.GetComponent

33、().cryX = i; _objgridi, j.GetComponent().cryY = j; continue; /向上 if (_mapgridi, j + 1 = 1) _objgridi, j = Instantiate(crystalsv0, new Vector3(i, j, 0), Quaternion.Euler(0f,0f,180f), _crytr); _objgridi, j.GetComponent().cryX = i; _objgridi, j.GetComponent().cryY = j; continue; /向下 if (_mapgridi, j -

34、1 = 1) _objgridi, j = Instantiate(crystalsv0, new Vector3(i, j, 0), Quaternion.Euler(0f, 0f, 0f), _crytr); _objgridi, j.GetComponent().cryX = i; _objgridi, j.GetComponent().cryY = j; continue; break; default: break; case 2:这里的四个if语句是利用数组来判断生成的水晶方向。数组的删补操作基本都要遍历数组,找到每个数组成员的(x,y)值获得上下左右的值,判断是否满足条件。比如这里有一个5*5的二维数组Y+211010y+100010y11101y-100011y-200110y/xx-2x-1xx+1x+2以坐标为(x,y)的点来算,点(x,y)的周围的8个点合计值为3,小于5之后(x,y)的值会从1变为0。水晶的生成则是判断点(x,y)的值是否为1,之后遍历上下左右,有值为0的情况下就有几率将0替换成3或4。 /填补 private void ResetMap_fill() for (int i = 0; i mapsize; i+) for (int j = 0; j = 5) mapgridi, j = 1;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 期刊短文 > 信息管理

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁