软件工程基于Unity3d的动作角色扮演类游戏的设计与实现.docx

上传人:b****8 文档编号:10224283 上传时间:2023-02-09 格式:DOCX 页数:48 大小:1.94MB
下载 相关 举报
软件工程基于Unity3d的动作角色扮演类游戏的设计与实现.docx_第1页
第1页 / 共48页
软件工程基于Unity3d的动作角色扮演类游戏的设计与实现.docx_第2页
第2页 / 共48页
软件工程基于Unity3d的动作角色扮演类游戏的设计与实现.docx_第3页
第3页 / 共48页
软件工程基于Unity3d的动作角色扮演类游戏的设计与实现.docx_第4页
第4页 / 共48页
软件工程基于Unity3d的动作角色扮演类游戏的设计与实现.docx_第5页
第5页 / 共48页
点击查看更多>>
下载资源
资源描述

软件工程基于Unity3d的动作角色扮演类游戏的设计与实现.docx

《软件工程基于Unity3d的动作角色扮演类游戏的设计与实现.docx》由会员分享,可在线阅读,更多相关《软件工程基于Unity3d的动作角色扮演类游戏的设计与实现.docx(48页珍藏版)》请在冰豆网上搜索。

软件工程基于Unity3d的动作角色扮演类游戏的设计与实现.docx

软件工程基于Unity3d的动作角色扮演类游戏的设计与实现

内容摘要

随着中国游戏以及互联网科技的发展,游戏越来越受到人们的欢迎,不管是手机游戏,电脑游戏,还是主机游戏,都在中国市场中占有很大的份额,游戏的交互性不同,以及按玩家年龄分类,分层等特点使得它适合各种年龄层的人。

在各种游戏中,角色扮演类游戏得到大多数人的青睐,在此之上衍生出的动作角色扮演类游戏由于动作元素的加入成为更多人的选择。

动作角色扮演类游戏是一种融合了动作类游戏以及角色扮演类游戏的一种游戏类型,玩家可以在体验游戏剧情的同时体验到游戏丰富的动作系统。

本次毕业设计制作的游戏便是一款角色扮演类游戏,但是求其风格偏向做出了调整,与以往追求爽快简单的动作角色扮演类游戏不同的是,本游戏加入了市面上一种新的“魂式”玩法,即更多的操作要求以及更难的难度,更加强调玩家的生存感,而是否能将这两者成功进行结合,产生一个新的方向,则是本论文所需要探讨解决的问题。

此外,游戏将使用Unity3D引擎进行制作。

关键词:

Unity3D;3D技术;动作角色扮演类游戏

Abstract

WiththedevelopmentofChinesegamesandInternettechnology,gamesarebecomingmoreandmorepopularamongpeople.Whetheritismobilegames,computergamesorconsolegames,theyallhavetheirownpositionintheChinesemarket.ThegameitselfisalsointheChinesemarket.Withalargeshare,thegame'sinteractivity,classification,andstratificationmakeitsuitableforpeopleofallages.Amongthem,role-playinggamesarefavoredbymostpeopleinvariousgames,andtheaction-playinggamesderivedfromthemarethechoiceofmorepeoplebecauseoftheadditionofactionelements.

Actionrole-playinggamesareatypeofgamecombiningaction-typegamesandrole-playinggames.Playerscanexperiencethegame'srichactionsystemwhileexperiencingtheplotofthegame.Thegamedesignedbythisgraduationisarole-playinggame,butitsstylehasbeenadjusted.Unlikethepreviouspursuitofrefreshingandsimpleactionrole-playinggames,thisgamehasaddedanewtypeonthemarket."Soul-style"gameplay,thatis,moreoperationalrequirementsandmoredifficultdifficulty,andmoreemphasisontheplayer'ssenseofsurvival,andwhetherthetwocanbesuccessfullycombinedtoproduceanewdirection,thispaperneedstoexploresolvedproblem.Inaddition,thegamewillbeproducedusingtheUnity3Dengine.

Keywords:

Unity3D3DtechnologyActionR

第一章绪论

一.1选题的目的和意义

随着现代科技的发展,电子游戏变得越来越多样化,更是形成了一种独特的游戏文化,各式各样的游戏层出不穷。

在中国,随着2014年游戏机禁令正式解除,索尼,微软,任天堂的游戏机以及游戏作品也是给中国玩家带来了更多的游戏体验,更是给中国游戏市场注入了新的力量,如今,中国的游戏发展迎来了全盛期,以腾讯,网易为首的游戏公司为玩家们带来了丰富多样的游戏,让中国的游戏业焕发了新生。

在最近的游戏发展中,产生了许多非常优秀的游戏,而在众多种类的游戏中,动作角色扮演类游戏更是经久不衰,其下众多的分支更是给这类游戏注入了强大的生命力,玩家喜欢动作角色扮演类游戏的原因大多是因为其优秀的动作手感以及剧情给玩家带来的代入感,不同于传统RPG回合制的战斗,ARPG带来的战斗多样性策略多变性更是引人入胜,因此我觉得开发一款ARPG游戏不仅能锻炼自己作为游戏制作者的能力,更能试着去为玩家带来更多的玩法。

Unity3D引擎同时也是国内开发产商最喜欢使用的游戏引擎,其轻便,核心化的开发功能更是为开发者们带来了便利,优秀的动作管理模块也为动作游戏的设计提供了基础,Timeline组件则能为人物剧情动画的设计提供帮助,是一款十分优秀的游戏制作引擎。

一.2国内外研究现状

1952年,剑桥大学一名计算机科学家开发出了史上第一款有记录的电脑游戏《Noughts&Crosses》,这是一款能在计算机运行的井字游戏,游戏的历史从此开始,在接下来的几十年里,计算机的崛起以及计算机语言的出现,游戏开始慢慢的发展起来,直到1972年,雅达利公司的NolanBushnellandAlAlcorn开发出了一款名叫《Pong》的游戏,这款游戏成为第一款在商业上取得成功的视频游戏产品,且在其后,越来越多“山寨”《Pong》的游戏出现,推动了整个视频游戏行业的发展,雅达利在商业上取得成功的同时,游戏业也开始迅速发展,街机游戏等开始充斥在大街小巷,特别是在1980年《吃豆人》这款游戏出现后,世界更是掀起了一股游戏热潮

随后,任天堂开始进军游戏界,为玩家带来了无数经典的作品,更是在当时成功垄断了日本的游戏产业,开启了游戏业的全新时代,接下来的几年内,PC端游戏《Doom》的出现,索尼和世嘉等各大游戏制作公司的加入,使得游戏行业开始往多元化发展,时至今日,国外游戏仍然蓬勃发展,游戏种类众多,玩法也朝着多种玩法相结合的方向发展。

一.3论文组织结构

最开始构思论文后,对相关专业资料进行了查证以及参考,由此确定了此动作角色扮演游戏的设计与开发的可行性,并结合相关游戏开发流程,包括整个开发周期和个人能力的预期,将此论文分为六章,其中每个章节的大致内容如下所示:

第一章:

绪论,主要描述了此项目的目的以及意义,此项目在国内外的发展研究现状;

第二章:

对本项目的开发需要用到的各种开发工具的介绍;

第三章:

拆分游戏功能模块,具体讲述每一个模块的具体实现方法

第四章:

描述游戏内的UI设计的以及实现

第五章:

游戏的剧情制作

第六章:

对游戏进行打包以及测试

第七章:

本论文的总结

第二章开发工具介绍

二.1Unity3D游戏引擎

二.1.1Unity3D软件介绍

Unity3D是一个由UnityTechnologies开发的3D引擎,不仅是游戏,借助Unity3D,制作者还可以创建建筑可视化,三维动画等待,其友好的可视化开发环境,能够让新手快速上手,而且Unity3D几乎不经过修改代码就可以实现跨平台的特性,更是在移动游戏快速发展的今天显得尤为重要。

Unity3D引擎自身拥有许多优势,相比一些产商需要付费使用的游戏引擎,Unity3D向广大游戏制作者免费开发,只有当游戏盈利超过一定金额才会向制作者收取一定费用,且引擎本身拥有充足的现成资源,其官方商城中更是拥有许多优秀的资源供制作者使用,制作者只需将资源整合,并为自己玩法编写一些脚本,便能制作属于自己的游戏,其便捷性是其他游戏开发引擎所不能比拟的。

二.1.2物理引擎

物理引擎就是模拟现实中真实的物理碰撞,重力反应,掉落等刚体行为的引擎,举个例子,愤怒的小鸟就是基于物理引擎制作的,小鸟被射出后掉落,撞击,都是物理引擎的应用,Unity3D使用的物理引擎为Nvidia的PhysX,物理引擎是一个计算机程序模拟牛顿力学模型,利用质量,速度,摩擦力和空气阻力等变量,来预测不同情况下的效果,被大量运用在计算机物理学,电子游戏,以及动画当中。

二.1.3Unity常用生命周期的函数

Unity3D中的生命周期函数需要继承MonoBehavior类才可以使用,且其生命周期函数全部都由系统定义好,系统自动调用,调用顺序和自行编写的顺序无关。

Unity3D中有一些最常用的一些生命周期函数,这份官方文档详细了讲解了这些函数的用法[2]。

二.1.4用户界面UI

本游戏的系统UI主要利用Unity3D自带UI插件UGUI进行制作,从Unity3D4.6版本之后,UGUI被集成到Unity的编辑器中,相较于旧的UI系统,它有了质的飞跃,其中主要优点在于灵活,快速,以及可视化,可视化的UI制作能够让制作者更加直观地看到成果,也使得制作效率更高,执行效果更好,以及更加简单上手,所有的布局,控件,调整后都能直接体现出结果,使得制作者能更容易地制作出更加好看的UI界面

二.2模型与动画

本游戏的模型以及动画的素材来自网络上的素材资源,再经过Unity3D的动画系统进行调整,整合,最终达到游戏中呈现的效果。

游戏中亦包含剧情动画,则运用Unity3D的TimeLine插件进行编辑,以及脚本进行控制所制作出来。

二.3C#开发语言

Unity3D中脚本文件使用的编程语言是C#语言,面向对象类型安全,来源自C语言系列,C、C++、Java和JavaScript程序员很快就可以上手使用。

C#能够很好地在Mac、Linux、Android、Windows还有IOS上运行;它之所以是很多人的最佳选择,是因为C#是编程语言创新方面的领导者,是原生跨平台移动应用程序的最佳选择,并且还有很多的优点超乎的想象。

二.4VisualStudio2017

VisualStudio是美国微软公司的开发工具包系列产品,VS是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等。

所写的目标代码适用于微软支持的所有平台。

第三章

游戏设计

三.1游戏场景设计与制作

整个游戏的场景包括开始游戏选择场景,剧情场景,游戏场景,三个场景,其中场景均是运用网络素材进行搭建,游戏选择场景搭配人物动画以及选单,显得更加动态化,剧情场景则结合Timeline动画进行设计,游戏场景为一个地牢大场景,其中又包括几个不同的小场景,小场景结合关卡流程进行设计。

三.1.1游戏场景制作

首先将下载的场景素材进行解包,基于素材进行场景大概构思,这里需要先完成游戏中地牢大场景的大概制作,然后进行细化,然后开始游戏选择场景和剧情则可以选择大场景中的一个小场景进行部分进行独立分化更改,加入人物以及动画。

图3-1为则第一个小场景的搭建雏形.

图3-1场景搭建雏形

将场景搭建完整,加入光源,物件,地牢大场景的俯瞰图如图3-2所示:

图3-2地牢场景俯瞰图

三.2游戏主角设计与功能实现

游戏中玩家控制的主角为一名骑士,在这里需要实现玩家的行走操控,动画控制器设计,攻击设计,技能设计,以及设置主角的跟随摄像机。

三.2.1人物模型设置

首先将从网上下载下来的人物模型进行解包,放入场景内,并将其AnimationType设置成Humanoid。

如图3-3和图3-4所示

图3-3角色模型展示图

图3-4角色AnimationType类型图

接下来将剑和盾导入场景,放在模型相应的部位下面,必须放在主角prefab下相应的子关节下,不然后面设置动画时会出现武器不跟手的情况,如图3-5所示:

图3-5角色绑定装备展示图

最后一个步骤就是给角色加上一些必要的组件,这里需要Rigibody,CapsuleCollider,以及Animator,AudioSource,如图3-6所示:

图3-6角色必备组件图

三.2.2角色的基本设计与实现

这小节需要编写脚本让玩家能够操控角色进行移动,首先,需要规划好人物的动作控制器,新建一个新的动画控制器,绑定到主角身上,预期主角需要三层动作,第一层是默认状态的动画控制,第二层则是玩家攻击的动画控制,第三层是玩家防御时的动画控制,因此做好规划后,建立三个层级,如图3-7所示:

图3-7角色动画层图

接下来进入基本层,添加一个BaseLayer,将走动的三个动画拖进去,并且设定其不同的权重,再回到基本层,将死亡动画以及滚动动画拖进这里,这里的触发条件都设置为Trigger类型,由于死亡是单向性的所以不用有回去的连线,还有一个重要的点就是为了动画的流畅性,必须消勾连接线的“HasExitTime”选项,设置完毕的动画基本层如图3-8所示:

图3-8角色基本动画层设计图

然后创建脚本PlayerMovement,利用脚本控制动画播放以及控制人物的移动,关键脚本如下:

1.  float lh = Input.GetAxis("Horizontal");  

2.  float lv = Input.GetAxis("Vertical");  

3.  

4.  Vector3 output = Vector3.zero;  

5.  

6.  output.x = lh * Mathf.Sqrt(1 - (lv * lv) / 2.0f);  

7.  output.z = lv * Mathf.Sqrt(1 - (lh * lh) / 2.0f);  

8.  

9.  moveInput = new Vector3(output.x, 0, output.z);  

10.  

11.  Vector3 cameraForward = mainCamera.transform.forward;  

12.  cameraForward.y = 0;  

13.  

14.  Quaternion cameraRelativeRotation = Quaternion.FromToRotation(Vector3.forward, cameraForward);  

15.  Vector3 lookToward = cameraRelativeRotation * moveInput; 

16.  

17.  if (moveInput.sqrMagnitude > 0)  

18.      {  

19.       Ray lookRay = new Ray(transform.position, lookToward);  

20.       transform.LookAt(lookRay.GetPoint

(1));  

21.      }  

22.  moveVelocity = transform.forward * playerSpeed * moveInput.sqrMagnitude;         

这里原本写完脚本之后,发现移动的时候加入往斜向方向移动时,速度会比上下左右移动要快些,这是因为控制上下左右是基于直角坐标轴,在斜向速度就会出现根号二倍速度的平方和的情况,这里有一篇论文提供了这种问题的解决方法,给出了一个公式,将直角坐标轴转换成圆形的坐标轴[13],利用这个公式,可以解决这个问题了。

大部分的参数都设置成Public,这样便于在Unity的面板里进行设置以及控制,就是做了可视化的处理,将脚本绑定到角色身上后,可以看到如图3-9的面板,给玩家设置运动速度,便可以通过键盘上的W,A,S,D控制角色移动。

空格键进行翻滚。

图3-9角色基本设置图

在这里需要注意的一点是,由于进入翻滚动画转换条件设置的是Trigger类型,假如玩家按键的速度快过动画播放速度,就会造成信号累积,按键结束后还有动画播放,因此需要用脚本在玩家按下一次后清理一次信号,编写一下脚本并绑定在BlendTree上。

进行设置,如图3-10所示:

图3-10动画控制器信号清理设置图

在进行基本设计的最后一步,需要摄像机能对玩家的运动进行追踪,将目标始终对准角色,因此需要编写一个摄像机控制脚本:

1.public class RPGcamera :

 MonoBehaviour  

2.{  

3.    public float cameraHeight;  

4.    public float cameraDisctance;  

5.  

6.    private Transform PlayerTran;  

7.  

8.      

9.    void Start()  

10.    {  

11.        this.PlayerTran = GameObject.FindGameObjectWithTag("Player").transform;   

12.    }   

13.     

14.    void Update()  

15.    {  

16.        this.transform.position = new Vector3(this.PlayerTran.position.x, this.PlayerTran.position.y +this.cameraHeight, this.PlayerTran.position.z - this.cameraDisctance);  

17.        this.transform.LookAt(this.PlayerTran);  

18.  

19.  

20.    }  

21.}  

将脚本绑定到摄像机之后,设定角度,测试无误,角色的普通状态基本操作就实现。

三.2.3角色的攻击设计与实现

在进入角色的攻击动画层次以及脚本编写之前,需要完成角色一些状态参数的设计,比如玩家的血量,经验值等。

需要在玩家状态脚本里面创建一些参数,后期这些参数会在UI设计的时候进行同步,也就是更加直观的表现给玩家,以下是需要的一些基本参数,血量,经验值,攻击力,技能攻击力,等级,攻击范围,这些参数在后面进行与敌人发生战斗的数值交换中会用到,现在先配置给玩家,将脚本绑定在角色身上,进行参数设置。

1.public Slider playerExp;  

2.public Slider playerHP;  

3.public int playerHealth;  

4.float exp = 0;  

5.int playerLevel = 1;  

6.public int damage;  

7.public int spDamge;  

8.public float range; 

第二步就是进行玩家的攻击动画层的设计,在这里采用了两端普通攻击一段特殊技能攻击的设计,触发条件同样选择Trigger类型,攻击同理,为了动画效果的流畅,需消勾“HasExitTime”选项,攻击动画层设置后如图3-11所示:

图3-11角色攻击层动画设计

接下来则是控制攻击脚本的编写,以下为攻击与特殊攻击初步实现的关键代码:

1. public bool attack;  

2.    public bool spAttack;  

3.    private bool lastAttack;  

4.    float timer;  

5.  

6.  

7.  

8.bool newAttack = Input.GetMouseButtonDown(0);  

9.        if(newAttack !

= lastAttack && newAttack == true && !

isDefend)  

10.        {  

11.            attack = true;  

12.            anim.SetTrigger("attack");             

13.        }  

14.        else  

15.        {  

16.            attack = false;          

17.        }  

18.        if (Input.GetMouseButtonDown

(1) && timer == 5)  

19.        {  

20.            spAttack = true;  

21.            anim.SetTrigger("spAttack");  

22.            timer = 0;    

23.        }  

24.        else  

25.        {  

26.            spAttack = false;  

27.        }  

接下来需要通过脚本控制Animator切换不同的动画层,来实现普通层和攻击层之间的切换,首先需要在攻击层的Idle动画和slash动画增加一个脚本,这个脚本的主要作用是用来向挂载有Animator组件的角色的兄弟组件传信息,脚本的关键代码如下:

1. public string [] onEnterMessages;   

2. override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {  

3.  

4.        foreach (var msg in onEnterMessages)  

5.        {  

6.            animator.gameObject.SendMessageUpwards(msg);  

7.        }  

8.    }  

9.}  

也就是起到一个传递信息的作用,需要先在动画上设置,在攻击脚本中便能接收这个信息,在玩家按下攻击按键时,动画层能接收到信息,然后改变动画层的权重,如图3-12所示:

图3-12攻击层信号设置图

在两个不同状态,一开始接收到AttackIdle的信号,攻击层的权重为0,当按下攻击键,开始攻击,攻击层的权重就变成1,这样就实现了普通层到攻击层的转换,关键代码:

1.void OnAttackIdle()  

2.    {  

3.        pm.inputEnable = true;  

4.        anim.SetLayerWeight(1, 0);  

5.    }  

6.void OnAttack()  

7.    {  

8.        pm.inputEnable = false;  

9.       

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1