魔剑传说游戏设计报告Word文件下载.docx
- 文档编号:18592478
- 上传时间:2022-12-28
- 格式:DOCX
- 页数:37
- 大小:2.48MB
魔剑传说游戏设计报告Word文件下载.docx
《魔剑传说游戏设计报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《魔剑传说游戏设计报告Word文件下载.docx(37页珍藏版)》请在冰豆网上搜索。
通过该动画系统,我们就能够很方便地在程序中控制动画状态的流动,以人物受到攻击播放动画为例,只要使用:
animator类提供的set系列函数,即可修改人物的动画状态:
3.2控制
人物控制的实现需要从两个方向考虑:
动作的控制和玩家视角的控制。
动作的控制主要用来与人物动画进行配合,通过解析用户的按键输入来切换不同的人物动画状态。
相对更复杂一些的是玩家视角,也就是镜头的控制。
在此项目中我们打算采用常见的第
三人称动作游戏视角,即需要将摄像机与人物绑定,并通过监听鼠标移动来改变观察角度。
我们提供了两种视角控制方式,分别是镜头自动跟踪人物前进方向的
MultiPurposeCamera方式,以及能够根据鼠标控制镜头方向的CameraMouseTurn。
这两个镜头控制脚本都是UnitySDK提供的。
3.3场景交互
场景交互也是该项目实现的另外一个难点,需要实现人物与怪物、NPC、场景物品等的交互功能。
人物与NPC、场景物品的交互实现相对较为简单,即发生交互时改变NPC、物品的动画并添加上一些对话框等UI控件即可。
至于人物与怪物的交互(主要是战斗)则存在许多细节需要仔细考虑其实现,比如如何检测人物打击范围,如何显示打击特效与打击过程中动画的变换。
在这个问题的处理中,游戏引擎的使用依然是关键。
首先是打击碰撞检测。
为了游戏性方面的考虑,人物最好能够使用多种不同类型、不同打击范围的武器,这样就不能仅仅通过相对距离来判断是否存在打击。
我们目前考虑的解决
方案是把每个武器单独作为一个GameObject绑定在人物的Object上,并给每种武器画上不同的Collider。
当用户按下某个攻击键时,才检测武器的Collider与怪物的Collider是否有接触。
但在实际开发过程中,我们在检测是否有接触时,发现用Collider来判断近距离攻击的算法并不现实,效果十分不理想。
因此后来我们想了另外一种判断方法,即基于人物和怪物的距离、人物朝向方向来判断:
当人物和怪物距离在攻击范围内,且人物朝向怪物时(人物朝向forward向量点乘人物位置指向怪物位置的单位向量结果大于0)则判定该攻击有效。
3.4角色状态维护
为了增加游戏的趣味性与挑战性,角色必须有诸如血量,攻击力,防御力等属性,且会随着游戏的进行而不断变化。
实现这一功能并不困难,只需要定义一个包含所有这些信息的类即可。
但值得一提的是,为了降低各个模块的耦合性,我们应该把角色的状态维护脚本与控制脚本分别单独实现,以便往后修改更新代码时能够快速找到相应的位置。
我们为此编写了一个类CharacterAttributes,将怪物、人物的共同属性都放在该类中实现,以便能够增加代码的复用性。
该类维护了HP,
MP等人物和怪物可以共有的属性,以及扣血,显示伤害文字等共有方法。
四、物品装备系统设计
4.1物品系统设计
整个物品系统包括背包系统、装备系统和商店系统。
所有系统都是以一个prefab为基础,将处理脚本挂到prefab上。
我单独使用一个摄像机投影各种系统的UI界面,这样使得人物和场景的转换不会影响物品系统的操作。
整个物品系统的架构如下图所示:
系统一共设计了五个GameObj,分别是:
管理文件存储(游戏节点保存)的
Save_Load对象,管理技能数据的Skill_Database对象,管理背包的Inventory对象,管理装备的Equipment对象以及所有管理物品信息的Item_Database对象。
每一个对象就是一个系统,由一个自行设计的prefab文件和一个或多个管理脚本组成。
以背包系统为例,首先需要设计一个prefab,UI设计如下:
UI的设计主要是使用了NGUI插件,其中提供了一些成型的组件,比如各种材料组件等。
基于这个NGUI插件的事件响应框架,设计了本游戏的物品系统UI。
在背包系统中,每一个放置物品的位置是一个cell,cell需要设置碰撞检测,在拖拽物品是保证完整的放到cell中。
UI需要设计一个背景层,这里选择使用一个透明背景,组件在NGUI中提供。
物品的图标来自DOTA的资源,背包下方的金币UI是通过moneyprefab实现的,分别设计一个金币图标,金币显示幕布和金币text,然后连接一个money的脚本即可。
除此之外还需要一个显示物品信息的prefab,这个prefab只需要设置UIPanel的脚本,显示不同的内容即可。
我将背包系统的perfab做层:
一层背包格子图片、一层物品图片。
分别用脚本控制物品的数量、物品的拖拽、物品的重复检查等等。
装备系统中也同样需要设计一个装备栏的UI,与背包UI类似的,设置6个cell,每个cell需要设计碰撞检测,对应的装备物品也需要碰撞检测。
我将信息的显示栏封装成一个单独的模块,所以在背包系统和装备系统中这个部分是可以重复使用的,只需要检测物品的类型和信息,然后调用输出即可。
在物品和装备的基础上,我设计了一个商店,商店也是一个单独的GameObj,由
prefab和脚本构成。
这里边功能脚本相对复杂一些,首先对于“购买”事件的响应,在获取用户交互信息之后,需要调用对应的修改函数,修改已有物品或者是添加物品到背包之中。
所有的处理过程和函数我将其封装到一个store脚本中。
在store脚本中设置了监听事件,在“购买”事件发生了之后,需要调用金币处理函数,对应的更改金币的信息,然后将UI界面上的金币数量刷新。
4.2技能系统与几点储存
技能系统相对于物品系统还是比较独立的一个模块,首先先在Skill_Database模块中存储技能的所有信息,包括技能的名称,类型(主动、被动),说明以及序号。
然后调用tips模块输出对于技能的说明,同时我单独设计了快捷键栏,对于每一个key值1-5,z-b都分别设计了一个prefab,功能重点在key的脚本。
在key的脚本中分别设计了初始化函数,对于技能的释放、信息存储、添加清空快捷键、以及技能的释放CD控制等。
在技能系统方面,UI的架构设计是主要的问题,这里边我在skill_UIprefab中绑定了控制脚本,所有的对于事件的响应处理函数都放在这个脚本中。
首先初始化技能列表,然后根据用户的交互,监听点击事件,拖拽事件,分别调用处理函数。
主要的处理函数有三个部分,一个是技能的修改,如技能升级,技能学习等;
一个是技能的拖拽更新,即将技能拖放到快捷键栏中;
还有一个是技能CD的处理,这个可以在NGUI中使用对应的接口以供调用的。
系统处理的难点在于窗口的控制,比如窗口、技能的拖拽、更新,隐藏与显示。
比如在拖拽的过程中需要对之前的操作进行清空,还要能在隐藏窗口之后正确还原。
这些细节都是需要在设计时反复处理的,比较麻烦。
技能的释放CD,我将功能封装到一个CD模块中,技能的CD可以调用U3D引擎中的Time类来具体设定。
CD的蒙版效果在引擎中有提供,可以直接调用,只要在脚本中设定就可以将蒙版效果与CD时间同步。
4.3技术细节的实现
在UI界面的设计上,三个系统的界面设计尽管效果不尽相似,但是设计的思路是一样的。
主要是cell的使用,其中要注意物品和cell的碰撞检测。
prefab的层次设计在背包系统中已有说明,这里不再赘述。
下面主要介绍一下各个脚本的设计实现。
仍然以背包系统为例,首先需要在脚本中初始化背包列表,添加各种存储物品。
物品信息需要从item_database中提取,这里我简单的把数据库设计成了文件,把信息写到文件中去。
初始化伪代码如下:
Initial{
//添count个物品
while(){
inventory.Add(newitem());
//从数据库中获取物品信息datebase=(finditembase)while(){
AddItem[];
//初始化背包InitInventory();
draggingItem=false;
dragedItem=newitem();
背包系统处理物品是添加物品是需要反复用到的,而且在与商品系统的关联过程中也需要用到,所以最好的方式就是将其封装。
添加物品的过程中需要判断原有物品中是否有本物品,如果没有则寻找一个空白cell添加进入,如果已经存在则需要在原有cell上更改物品数量。
下面是添加物品的伪代码:
AddItem(物品id){
while(遍历背包物品){
if(该id物品在背包内){
if(背包有空格){
if(inventory[i].itemNum<
inventory[i].itemMaxNum){
物品数量加1;
else(如果该id物品不在背包内){if(inventory[i].itemName==null){
添加物品
if(如果没有找到未满的物品){
while(遍历背包)
{
if(inventory[i].itemName==null){
创建新物品
类似的其他系统的控制脚本思路也大致相同,需要对每一个相应事件进行判断然后对应的处理。
比如在装备系统的控制脚本中,同样是定义了初始化函数、更新装备函数、显示装备函数、保存和加载装备函数。
而这些函数的调用全部都是通过NGUI的事件响应机制。
最后整个系统的UI管理界面我封装了一个上层的管理脚本,叫做UI_Manager,它是被绑定到了UI_Root下,也就是UI的根对象上,下面对这个管理脚本做一下详细分析:
首先获取UI界面的所有对象,包括各种背包、技能框、信息栏等等。
publicTransformequipment;
//装备框publicTransforminventory;
//背包框publicTransformshort_cut;
//快捷键框publicTransformskill;
//技能框
publicTransformstore;
//商店框publicTransformtemp;
//拖拽图标publicTransformtooltip;
//信息框
publicList<
Transform>
UI=newList<
();
然后初始化这些UI的位置和顺序,以及事件:
调用transform.FindChild()函数来获取各个组件,这与Android等很多语言都很类似,就不多赘述了。
之后调用UI.Add初始化UI的位置:
UI.Add(equipment);
UI.Add(inventory);
UI.Add(skill);
UI.Add(store);
//初始化UI顺序及UI事件
for(inti=0;
i<
UI.Count;
i++){SetDepth(UI[i],i+1);
UI_Event(UI[i]);
其中在UI设定的时候需要设置其深度,事件监听,UI置顶等,这些也都以函数的方式实现:
//UI单击事件
voidUI_Click(GameObjectui,boolisPress){if(Input.GetMouseButtonDown(0)){
UI_Top(ui.transform.parent.parent);
//UI置顶
publicvoidUI_Top(Transformui){for(inti=0;
UI.Count;
i++){
if(UI[i]==ui){
UI.Add(UI[i]);
UI.RemoveAt(i);
UIOrder();
break;
//设置UI深度
voidSetDepth(Transformui,intdepth){if(ui.name=="
store"
||ui.name=="
skill_UI"
)
ui.Find("
Win/ScrollView"
).GetComponent<
UIPanel>
().depth=depth;
ui.Find("
Win"
五、技能特效设计
根据剧情设置,主人公提拉米苏的手持武器为剑,并且具有火系魔法,因此在技能特效的设计上主要分为魔法特效的设计与刀光效果的设计两部分。
5.1魔法效果设计:
由于游戏中需要比较炫的特技效果,因此原本希望利用Unity自带的ParticleSystem
完成,但实际的各个种类粒子特效的效果比较单一,需要多种效果进行组合完成。
魔法效果的设计上主要以以下几种效果为主:
火焰特效
由于剧情中主人公为一个火系魔法师,因此在特效的设计上最重要的一项特效便是火焰特效,剑所指之处可以生成一团火,对于敌人造成大幅伤害。
在火焰效果的实现上,主要采用了粒子系统中的如下几种单独的粒子特效
通过调节每个粒子特效的Duration,Startlifetime,StartSize,StartSpeed等粒子的设定参数,并进行整合即可得到预期的效果。
最终效果如图:
烟雾特效
在躲避敌人的过程中主人公还可以通过释放烟雾的障眼法方式进行短时间的缓冲,因此还设计了烟雾特效。
烟雾特效主要模拟的是空气中的气体与灰尘的效果,起到阻碍视线的作用。
烟雾特效与火焰特效的原理类似,但主要的粒子系统使用以气体与烟尘的相关特效为主
闪电光特效
烟雾魔法特效
与火系相伴的更加强有力的伤害效果便是电击,电击既可以瞬间减慢敌人的速度又可以远距离对敌人造成重创,是一种十分高效的技能方式。
同样与前两种特效的制作方式类似,将基础的Partical换为闪电相关进行组合。
为了突出特效的炫的特点,在每个粒子系统的重心设置点光源,因此使得特效具有了魔法的属性,带有自发光的性质,对普通粒子系统特效平淡生硬的特点进行了一定的改善。
由于初次尝试Unity,尝试几次自己组合ParticalSystem的元素制作特效的过程中很难做出炫酷美观的效果,因此最后游戏的实现过程中借鉴了网上流传的几个特效成品,使得游戏的画质效果得到提升。
5.2刀光效果设计
刀光效果的实现首先为Weapon添加一个Trailer,追踪武器的运动轨迹,并对应设置预先找好的刀光贴图,即可沿着轨迹的路径制作刀光效果。
其中,对于Trailer的设置如下:
随动作的刀光实现效果
六、场景设计及搭建
根据游戏剧情的需要和ARPG游戏场景切换的需要,游戏场景主要搭建了两个场景:
村庄场景和战斗场景。
村庄场景主要用于人物教学关卡的实现,人物装备强化和商品交易的需要以及人物剧情的触发等等。
战斗场景则用于提供玩家操控的人物和AI战斗的场所。
在战斗场景中会出现一定数量的“怪物”,当玩家将AI消灭以后,则提示玩家成功通过关卡,回到村庄来触发进入下一关卡的剧情。
村庄场景
战斗场景
在游戏场景的实现过程中,场景的搭建是必不可少的。
由于对于物体建模技术掌握的了解较少,所以在场景的实现过程中,绘制场景的资源主要从网站上下载和获取得到。
将各个物体模型导入之后,剩下的工作便是拼接和搭建。
但是搭建出场景只是场景绘制的第一个步骤。
合理和光照和碰撞检测的设定对于游戏的体验性同样重要。
6.1场景光照的设定:
场景中的光源的设定主要通过一个平行光源和数个点光源覆盖实现。
平行光源(方向光)用于显示游戏中阳光或者主要光源的方向,同时也是用于显示阴影的主光源。
而分布于场景各处的点光源可以填充场景中的黑暗和阴影区域,同时将场景细节和各个地方的景物显得更加明亮。
补充光的光线可以表现出景深和逼真的感觉。
通过场景中各个光源的交互和叠加,最终达到想要实现的主体或者情景。
期中关于场景主体色的选取和绘制,只需要在添加光源时选取好光源的颜色即可以实现不同的主题色的设定。
同时在绘制阴影时没有必要将场景中的每个光源都绘制阴影,而且绘制阴影的代价是十分昂贵的(尤其是光线跟踪阴影的情况)。
在我们游戏的场景中只需要为主要场景设置阴影即可。
6.2碰撞检测的设定
为增加游戏场景的真实性,游戏模型的碰撞检测的设定是必不可少的。
在碰撞检测设置的过程中主要是通过meshcollider设定,即通过物体的meshrender相连顶点得到得到物体的collider。
但是meshcollider的方法只对于凸多面体适用,而且为了减少计算,
Unity在生成物体的collider时会自动选取其突出的顶点相连。
而如果物体具有空洞或者伸展的地方较多,用meshcollider的方法则会出现空气墙。
例如上图中城门的collider就无法采用meshcollider绘制,否则会出现空气墙导致人物无法穿过的情况。
所以在添加城门的collider时,采用了boxcollider堆叠的方式添加。
为增强游戏的趣味性和真实性,而且考虑到我们是ARPG实时战斗类型的游戏,在场
景中几乎要对场景中的每个物体添加碰撞检测的collider。
6.3场景小地图的添加和绘制
为增强游戏的可玩性和趣味性,根据玩家游戏体验的需要,在游戏中我们增添了小地图的显示功能。
具体的方法是在玩家的头顶上方放置一个方向向下的摄像机,将这个摄像机放置在人物的组下面,这样这台摄像机的方向和位置会根据人物的位置和方向变化而变化,但是由于人物具有跳跃的动作,但是需要保证摄像机的y轴坐标不会根据人物的y坐标变化而变化,控制小地图摄像机的y坐标不变需要为摄像机额外添加控制显示的脚本。
这样可以控制摄像机的位置只随着人物在xz平面的位置变化而不会根据人物的跳起动作而变化,同样摄像机的方向也不会根据人物的旋转而改变。
摄像机的位置设置好之后需要添加设置一个texture,然后将摄像机的targettexture
设置为相应的texture。
这样摄像机拍摄下来的影像就会映射到相应的texture上。
得到人物头顶摄像机之后需要将摄像机拍摄出来的图像显示到我们的最终的视口上,接下来需要添加一个canvas。
然后在canvas中添加一个图片(image),然后将它的texture设置为我们摄像机映射的texture,这样在这个图片中显示的就是人物头顶摄像机拍摄得到的影像。
为了区分小地图的影像和真实地图的图像,我们给小地图添加了边框的效果,并让小地图显示限制在一个
圆形区域中。
主要方法是将RawImage放在另一个image中,而它的上一层image则是一个圆形的图片用来限定image的显示范围。
同时circle则是一个边框,与image放在同一层,用来显示小地图的边框效果。
这样小地图初步的效果已经实现了。
为了突出显示下地图人物的位置和方向,并且便于和地图中的其他object分开显示,同样在人物上方添加一个图片。
同样为图片添加一个控制显示的脚本,保证图片只是根据人物在xz平面上的位置和方向变化,而y坐标不会根据人物的跳起而发生改变。
设置完成之后,为保证主摄像机不会看到添加的标识人物位置的图片显示,而头顶摄像机不会看到人物,需要将标记图片和人物设置在不同的level(层),摄像机的显示层同样设置显示不同的层级,这样可以保证每个摄像机看到的只是它们需要看到的object。
摄像机层级显示的设置在CullingMask属性中,例如在头顶摄像机中不显示
Character(人物层),同时将人物设置在Character层,这样在头顶摄像机便不会看到人物,而只会看到我们设置的图标。
到此小地图的添加以及绘制已基本完成。
七、怪物AI
在动作游戏中怪物的AI是玩家最为看重的一点。
在设计怪物AI之前首先要实现怪物的动画状态机。
目前我们游戏中只加入了两种怪物,因此我们分别为两种怪物设计了动画状态机:
哥布林动画状态机
Boss动画状态机
怪物动画状态机的控制与人物状态机看似没什么太大区别,但人物状态是玩家控制的,而怪物状态则完全是由程序控制的。
我们设计的怪物有三种状态:
巡逻,追赶玩家和战斗。
当怪物距离玩家较远时,怪物在固定的3个点来回缓慢行走(Walk)同时关注自己周围是否有玩家进入;
当怪物发现有玩家进入周围时,进入追赶玩家状态,朝着玩家的方向奔跑
(Run);
在追赶状态,当玩家跑远了,怪物发现玩家已经不在自己范围内时则返回巡逻状态;
反之当追赶上玩家,即玩家在自己攻击范围内时则进入攻击状态,此时不再移动,而是朝向玩家播放攻击动画。
将上述过程转成代码实现如下:
八、过场动画
现在几乎所有游戏开场过程中,通常都会有一段唯美的CG动画作为游戏的背景故事介绍。
虽然在游戏过程中没法用CG做剧情动画,但如果能用
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 魔剑 传说 游戏 设计 报告