基于unity3D的角色扮演类游戏设计与开发
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于 unity3D 的角色扮演类游戏设计与开发
发布时间:2021-02-19T05:35:33.972Z 来源:《科技新时代》2020年11期作者:赵威
[导读] 随着科技的迅速发展,生活节奏日益加快,游戏成为了人们生活中必不可少的一部分,RPG 游戏以其完整的故事情节,强烈的代入感,较为简单的操作要求成为了备受广大群众欢迎的游戏类型之一,但现有的 RPG 游戏仍不能满足所有玩家的需要。
本次设计并开发一款 RPG 游戏《可可萝历险记》,是为以后做出一款能够被广大人群称赞的 RPG 游戏设计与开发的一款基础的PG 游戏框架,将以
Unity2017.4.20f2 为开发工具,以 C#语言为主要的编程语言。
赵威
山西农业大学山西晋城市 048100
摘要:随着科技的迅速发展,生活节奏日益加快,游戏成为了人们生活中必不可少的一部分,RPG 游戏以其完整的故事情节,强烈的代入感,较为简单的操作要求成为了备受广大群众欢迎的游戏类型之一,但现有的 RPG 游戏仍不能满足所有玩家的需要。
本次设计并开发一款 RPG 游戏《可可萝历险记》,是为以后做出一款能够被广大人群称赞的 RPG 游戏设计与开发的一款基础的PG 游戏框架,将以
Unity2017.4.20f2 为开发工具,以 C#语言为主要的编程语言。
需要从游戏的策划、素材的加工、各功能模块的设计到代码的实现,最终形成一个完整的 3d 游戏,并通过 Unity 选择平台生成可执行文件。
经过实际开发,拥有了基础的任务系统、战斗系统、宠物系统等基本功能。
关键字:C#;Unity;RPG 游戏;
1 绪论
1.1 游戏产业发展背景
游戏产业最早从美国开始发展,很快就扩展到了全世界。
时至今日,游戏行业蓬勃发展,据中国经济网发布的数据显示:2019 年我国游戏市场和海外市场出口收入再次急剧提升,收入超过了 3100 亿元。
同时游戏产业的发展也带动了直播行业、赛事、俱乐部的发展。
随着游戏的不断发展和电脑配置的不断提高,2d 游戏已经不足以满足人们的需求,3d 游戏迅猛发展,如今3d 游戏已经占据了游戏市场的很大比重,而 3d 游戏仍有无限的发展空间。
1.2 开发意义
游戏是时代产物,它有巨大的商业价值,它是科技进步的体现,深受广大青年的喜爱,给人们带来了心灵的安慰,现代的社会缺少它将无法正常运转。
本此游戏开发的目的在于理解游戏的交互式结构,掌握游戏角色、道具、UI 的设计方
法,掌握游戏脚本的编写技巧,了解游戏中人工智能的设计方法从而编写怪物 AI。
进而锻炼自己的动手能力、独立思考能力和编程能力,最终开发出一款拥有一定可玩性的 RPG 游戏。
2 相关概述
2.1 Unity3d 引擎简介
Unity3d 是由 Unity Technologies 开发的一个让开发者轻松创建诸如三维游戏、建筑可视化、实时三维动画等类型互动内容的多平台综合型游戏开发的工具,是一个资源全面整合的专业游戏引擎 Error! Reference source not found.。
Unity 有三大优点:面向组件、可视化、跨平台。
在游戏运行前就可以看到游戏的各个模块,一次开发就可以发布到不同平台,使得 unity成为当今的主流游戏引擎之一。
当下最火的游戏王者荣耀、炉石传说等游戏就是以 Unity 为引擎开发的。
2.2 C#语言简介
C#是一种安全的、稳定的、简单的、优雅的,由 C 和 C++衍生出来的面向对象的编程语言。
它继承了 C 和 C++强大功能,去掉了一些例如没有宏和模版,不允许多重继承的复杂特性。
C#综合了 VB 简单的可视化操作和 C++的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET 开发的首选语言。
3 开发环境介绍与配置
本此游戏开发在 Windows 系统下,使用 Unity 2017.4.20f2 引擎进行游戏主体的开发,使用 Visual Studio 2019 编辑器,以 C#作为基础语言进行脚本编写,最后使用 XML 存储游戏数据。
Unity 2017.4.20f2 版本是 unity 长期支持的一个版本,在官网中下载安装,注册账号并以个人身份激活 unity3d 引擎便可免费试用。
但是以这种方式激活有频繁时间限制,可能每天都需要激活一次。
打开 unity 引擎后,点解上方 Edit,点击 preferences,点击 External Tools,在 External Tools Editor 中将 Visual Studio 2019 设置为默认编辑器,就可以在开发脚本时使用。
在游戏资源方面可能会有以.max 为后缀的文件,需要下载安装 3dmax,打开后将其导出为 fbx 格式文件
才可以在 unity 中使用。
4 游戏策划
4.1 游戏简介
《可可萝历险记》是使用 Unity3d 引擎开发的一款单机的 3dRPG 游戏,游戏中我们将扮演一个可爱的角色可可萝,在古风的世界中探索,与强大的敌人战斗。
4.2 主要剧情
被封印的黑暗女王苏醒,带领手下入侵人们的家园,于是异常保卫家园的战斗爆发了,玩家将扮演女骑士角色,寻找传说中的铠甲与宝剑,不断地强化自己的能力,与暗黑女王进行斗争,最终将其重新封印,保护人间的太平。
4.3 UI
在每一款软件应用中,用户界面(UI)都是核心特征。
游戏 UI 将直接影响用户的体验感,精美的 UI 更能吸引玩家。
本作使用了简洁明了的 UI 界面,主场景中玩家可以在左上角看到自己的状态,在左侧中间是追踪的任务,在右上角看到小地图,屏幕下方有技能按键和常用的功能键。
背包和技能、人物信息页面用全屏 UI,能够详细的描述其功能。
4.4 游戏场景
游戏中运用了古风的场景,场景中有美丽的古风建筑、青葱的翠竹、火红的枫叶、随风飘散的蒲公英、潺潺的流水、高耸的石山等。
场景中花草树木等游戏对象添加了 LOD Group 组件,它可以起到摄像机距离过远就不再渲染该对象从而降低性能消耗的作用。
图1游戏场景
4.5 游戏角色
游戏主角分为主角和 npc。
主角色采用了动漫美少女的形象。
npc 有制造装备的铁匠、售卖道具的杂货商、任务发布者、为了不让世界显得单调的普通人。
有些 npc 甚至可以帮助主角战斗。
4.6 战斗系统
战斗系统采用了高自由度的战斗风格,传统的回合制战斗虽然简单但会显得无趣。
进入战斗状态时,人物的待机动作、背景音乐等会发生改变。
进入怪物的领地会自动进入战备状态,打败的敌人会掉落各种道具,并会在一定的时间后重新生成。
被杀死会掉落金钱、磨损大量的装备的耐久度,重生到出生点。
4.7 任务系统
玩家可以与头顶带有问号标记的 npc 对话来接取和提交任务,也可以通过告示板来获取一些咨询和任务。
任务接取后会显示在左侧中间的任务栏中以作提示。
完成任务会增加角色的经验,部分任务不需要与 npc 对话就可完成。
任务分为主线任务、支线任务、寻宝任务、狩魔任务四种。
主线任务的主要功能是推进故事的发展,同时会获得大量经验。
支线任务会获得各种道具。
寻宝任务可能会遇见强大的宝物守护者,击败他们找到宝藏吧。
告示板或特殊的 npc 会发布狩魔任务,完成后可以获得大量的金币和战利品。
4.8 道具系统
道具分为装备、消耗品、杂物、任务道具四大类。
玩家可以通过完成任务、击杀怪物掉落、寻宝、商店等方式获得不同的道具。
道具获得后会存储到背包中,鼠标移动到道具上可以获得相应的描述。
本次开发中道具的掉落是固定的,装备属性不会由系统随机生成。
4.9 宠物系统
由于工程量巨大,简略了宠物功能。
本次开发中宠物仅供观赏,并不会帮助主角战斗,但会跟随人物移动,人物待机时,宠物会做出一些动作。
通过各种渠道获得宠物后,会在宠物界面解锁已经获得的宠物,玩家只可以选择一个显示在游戏主场景中。
5 游戏的设计与实现
5.1 创建游戏工程
打开 unity,任选一目录新建工程,创建 Scenes 文件夹保存场景文件,创建 Scripts 文件夹保存脚本文件,创建 Prefab 文件夹保存预设体文件,创建 Audio 文件夹保存声音文件,创建 Materials 文件夹保存材质球,创建 Textures 文件夹保存贴图文件,创建 Animation 文件夹保存动画文件,创建 Animator 文件夹保存各个模型的动画控制器文件,创建 Shaders 保存 Shader 文件,创建Resource 文件夹保存各种资源,创建 UI 文件夹保存 Sprite 图片。
5.2 资源的准备
5.2.1 模型资源
开发者可以根据需求可以自己制作 3d 模型,但需要耗费巨大的时间成本。
3d 模型的素材一般使用 3dmax 或 maya 软件制作,再用 ps 或 bodypaint3d 绘制贴图。
从一个box 盒子开始制作人物模型将会耗费大量的时间和精力。
简单的模型素材如场景中的箱子、杆子、
楼梯灯可以自己制作。
本次开发只有极少数模型为自己制作,大多数模型素材为网上的资源。
5.2.2 场景资源
Unity 自带的地形功能 Terrain 可以用来搭建简单的场景。
创建 Terrain 后场景中会出现一个平面,再通过笔刷可以升降地形制作出跌宕起伏的山峦丘陵(必须先设置平面的高度>0 才能用笔刷让平面某部分下降),也可以在上面种树等。
做出大概的地形后,将导入的建筑模型摆放上去,同样的石头、树木等素材调整不同的角度和位置变回变成美丽的场景。
5.2.3 动画资源
动画资源指的是人物和怪物的动作,动画资源可以再 3dmax 中制作,需要将人物或动物绑定骨骼,调整每块骨骼控制模型的部分(点、线、面),之后通过设置关键帧,在关赵威:基于 unity3d 的角色扮演类游戏设计与开发
键帧中调整模型的动作后,3dmax 会自动计算补充人物中间动作来达到制作动画的效果。
如果人物用的是同一副骨骼,就可以共享这些动作,但由于模型问题会产生少许的偏差。
5.2.4 导入方式
如果是自己在 3dmax、maya 做的模型资源,需要我们导出为 fbx 格式的文件,放入建好的 unity 工程的 asset 文件夹的子目录下便可以在 unity 场景中使用。
后缀为.unitypackage的文件,需要把文件名中的中文字符去掉再双击打开,等待 unity 准备完成点击 import 即可。
5.2.4 资源使用方式
将资源放入相应的文件夹,模型资源直接拖到场景中即可。
材质、声音等资源需要给游戏对象添加上相应的组件后将其加入对应组件的属性中。
资源整理后可以将其直接拖拽到 Prefab 文件夹中,unity 会把拖入的资源自动生成为预设体文件,之后我们可以用代码来生成这些预设体文件。
5.3 UI 的搭建
5.3.1 帆布 Canvas 简介
首先在 Unity 中创建 UI-Canvas,Canvas 相当于帆布,之后的所有 UI 都需要放在其上。
其中有图片 image、文本 text、按钮 button 等。
Canvas 中的渲染模式(RenderMode)提供
了三种方案:
第一种,ScreenSpace-Overlay,这种模式不需要摄像机,Canvas 中的所有 UI 都会显示在屏幕的最上层,遮盖掉从主摄像机获取的游戏场景画面。
本次开发中游戏主界面的 UI就采用这种方式。
第二种,ScreenSpace-Camera,这种模式需要摄像机,在这种模式下可以让 2d 的 UI和3d 物体并存。
通过调整 PlaneDistance 调整摄像机与帆布的距离。
第三种,WorldSpace,需要摄像机,是纯 3d 的 UI。
Npc 名字和怪物血条等需要用到这个模式。
5.3.2 精灵 Sprite 简介
精灵 Sprite 是 Unity 中绘制图集的控件,他可以把一张大的充满各种元素的图片中的元素裁剪出来,然后保存为一个图集,其中各元素都可以作为 Image 使用。
普通的图片也需要更改成精灵模式才可以在 UI 中使用。
本次开发 UI 中许多图片都是从网上截取的图片,通过unity 中精灵的编辑成为 UI 中的一部分。
5.3.3 登录界面
本次开发中将登录界面独立为一个场景,这样在游戏运行时将会降低性能消耗。
登录界面的需要用户输入正确的用户名和密码才可以开始游戏。
开始后会出现选项:新的开始、读取存档、设置。
选择新的开始或读取存档后便会加载游戏场景,进入游戏。
场景之间的切换用到了读条界面,一般游戏的读条界面都是假的,并不具备与加载进度匹配的功能,只是起到了缓解玩家等待时焦急的作用。
要做到场景切换需要将所有需要的尝尽添加到 Scenes in Build 下,之后才能通过代码进行场景切换。
5.3.4 游戏主界面
主界面包括人物信息展示、任务栏、技能栏、小地图、各种功能按键。
人物信息栏包括人物头像图片,血条、蓝条和文字,其中血条和蓝条下有黑色空白图片,通过代码计算人物血量百分比来改变血条、蓝条的长度从而实现血条蓝条的可视化增减功能。
血条和蓝条上相应的数字也会发生改变。
任务栏只显示当前追踪的任务来方便玩家完成任务,想要更改追踪的任务需要按j 键或点击功能栏中的任务图标打开任务界面。
可以通过导航系统来自动移动到任务目的地,方便了玩家寻路。
屏幕下方的技能栏只能显示并存放已经学会的技能。
需要按 k 键或点击功能栏中的技能图标,打开后拖动已解锁的技能到相应的格子。
小地图有两种方案:第一种需要美工来帮忙绘制一张地图,通过代码获取人物的位置和朝向来显示在主界面中。
第二种需要创建一个摄像机,Camera 的 Projection 有两种模式可选择:1.Perspective(透视)、2.Orthographic(正交),透视模式会呈现出近大远小的效果,而正交模式无论距离物体多远看到的都是一样的,制作小地图需要采用透视模式,将摄像机放在适当的高度,然后新建一个 RenderTexture 拖到摄像机的 TargetTexture 属性上,之后再从 UI 中新建一个 RawImage 调整好位置,将 RenderTexture 拖到 RawImage 的 Texture 属性上即可。
图2游戏主界面
之后我们在人物模型的头顶添加一个 cube 盒子,贴上箭头贴图,放入人物模型充当其子文件,在小地图上就会显示这个箭头。
这种效果的小地图会显得比较突兀,我们只需再加个边框即可。
各种功能按键采用了水平布局(HorizontalLayoutGroup)的方式,设置好边距等,这样在代码中方便用 GetChild 方法来寻找各自的功能。
5.3.5 各种功能界面
主要包括背包界面、技能界面、宠物界面、任务界面、商店界面等。
其中背包界面用了 ScrollView(滚动视图)来显示背包格子,删掉了水平滚动,只保留了垂直滚动,在ScrollView(滚动视图)下添加了 GridLayoutGroup(格布局),网格布局设置好间距后会自适应生成背包
格子,再添加组件:Content Size Fitter(自适应大小)其功能是根据对象的内容多少, 适应宽 这样便可以自适应滑动框的大小,从而使我们可以通过滚轮从上翻到下。
背包和宠物界面会展示人物和宠物的形象和待机动作,其原理和小地图相似。
5.4 动画状态机的设计 5.4.1 主角动画状态机的设计
动画状态机的作用就是帮助我们管理人物动作和动作间的逻辑关系,人物模型想要做出各种动作需要添加该组件。
旧版 Unity 使用的是 Animations 来控制人物动画,新版则使用 Animator,Animator 是将 Animation 统一管理在进行逻辑状态编辑的组件,它方便于图形化状态管理,如果人物只有一个动画用 Animations 比较方便,本次开发中主要使用的是Animator Controller。
图3主角角色状态机
设计主角的动画状态机需要考虑主角可以做的动作和做这些动作所需要的条件,以及这些动作之间互相切换的条件。
应为采用了自由度较高的游戏方式,所以主角的动画状态机的设计相对于怪物、宠物、npc 等角色的动画状态机更加复杂。
也是本次游戏设计与开发中的难点之一。
以下为主角的动画状态机:
本次开发中用到的动作有限,经过不断地思考与改进,做出了这套较为好用的动画状态机。
其中人物动画有战斗状态下和脱战状态下有两种移动方式,可以通过动画状态机切换。
图中黄色图标为默认状态,一进入游戏,主角便会播放默认的待机动画,再非死亡和攻击时角色都可以跳跃,角色只有在战斗状态才会触发死亡事件,播放死亡动画。
角色的技能全部在右上角的融合树 ATK 中(融合树 Blend Tree 可以将相同或相似或功能相似的动画放置在一起,通过参数来控制具体需要播放哪个动画),这样只需要传入一个参数便可以控制角色的多个技能,非常实用。
左侧为控制主角进行各种动作所需要的参数,箭头代表着切换的路径和条件。
动画状态机设计好后需要添加虚拟按键和脚本来控制主角的移动和各种操作。
本次开发主角的移动与摄像机有关,按下 w 或 s 键主角会向当前摄像机照到的前方或后方移动,按下 a 或 d 键同理,在移动中按下左侧 shift 键可以奔跑,人物前进速度会变快,人物动作也会随之改变。
技能默认设置为 q、w、e 键上方的 1、2、3 等键位。
5.4.2 敌人、npc 等角色动画状态机的设计
由于敌人不需要由玩家操作,纯粹由脚本控制,所以动画状态机中只需加入敌人拥有的全部动画,根据敌人 AI 需要设置好条件即可。
而普通的 npc 只需要将待机动作加入,使得 npc 不是非常死板即可。
可以与玩家互动的特殊的 npc 将采用另外的动画状态机。
5.5 物理引擎 5.5.1 碰撞体组件
碰撞体(Collider)是指用一个包围盒将模型包裹起来,用来进行碰撞检测的工具。
碰撞体包围盒有球型、长方体、胶囊型和网格型,形状不同但功能是相似的。
网格型较为复杂,需要根据模型的外壳自行设置,开启碰撞检测后将会消耗巨大的性能来计算,一般不用,如果需要高精度的碰撞检测,也需要尽可能的减少模型的三角面数。
人物模型一般选择胶囊型,添加 CapSule Collider 组件后,编辑大小使其刚好包围住人物模型即可。
5.5.2 刚体组件
刚体组件(RigidBody)是用来完成逼真的物理效果的组件,可以用它来设置重力、阻力、作用力与反作用力等。
将其添加到人物模型上,开启重力之后人物模型便会受到重力的作用站在地面上,之后我们一般会选择锁住角色的 x、y、z 三轴否则人物发生微小的碰撞就会改变人物模型的欧拉角(如果不锁定人物模型会产生摔倒、倾斜等不符合常理的动作)。
刚体组件也是发生碰撞的必要组件,弓箭、剑气等远程攻击需要给发射出的对象添加刚体组件。
5.5.3 碰撞检测
在 unity 中两个物体必须都添加了碰撞体组件,并且至少其中一个物体添加了刚体组件才能产生碰撞。
可以在碰撞体组件的 isTrigger 属性中选择这个碰撞体是否为触发器,如果选择让他充当触发器,就可以在这个物体上添加代码来触发一些游戏事件,例如在靠近 npc 时会弹出小框提示按下 f 键可与之对话,靠近掉落道具时按下 f 键打开掉落道具栏,在进入怪物领地时会被怪物发现等功能由触发器实现。
碰撞检测是游戏必须的模块,碰撞的检测有三种:连续检测(Continuous),是效果最好的检测方式,不会出现穿模问题但性能消耗极大;离散检测(Discrete),如果物体运动速度过快就会出现穿模的问题(没来得及检测到碰撞体,就已经传过去了),性能消耗最低;动态连续检测(Continuous Dynamic),它的效果介于上面二者之间 Error! Reference source not found.。
玩家无法穿过墙体、攻击打中怪物等功能的实现需要进行碰撞检测。
5.5.4 物理射线
物理射线 Ray,由起点、方向组成,用于检测碰撞体。
虽然叫做射线,但并不是无限延长的,应为无限延长将产生巨量的性能消耗。
我们可以通过代码来获取鼠标坐标转换成一条由摄像机发射到场景中的射线,就可以检测到鼠标点击的是场景中的哪个物体。
如果需要人物移动到鼠标点击的位置就需要用到物理射线,本次开发在人物移动方面没有用到物理射线,但在编写怪物的 AI 时需要判断怪物与主角间是否隔着墙壁,这个功能需要物理射线来检测。
5.6 相机的控制
摄像机将直接决定玩家看到的画面,它是一个游戏的灵魂。
摄像机的控制也与主角的控制方式有关,为了让玩家看到舒适、稳定、不眩晕的 3d 画面,摄像机需要平稳的跟随主角移动。
在本次开发中,采用了用鼠标左右滑动来控制摄像机围绕主角转动的方法,在按下前进键后任务会超当前摄像机视眼的前方转身并移动。
鼠标上下移动可以看到天上和地面,但是限制了上下移动的最大程度,这样可以使玩家不会迷失方向感。
鼠标滚轮来控制视眼的大小,同样限制了最大和最小的程度。
摄像机跟随人物的算法是用检测人物上一帧和当前帧的变化来移动摄像机的方法。
5.7 导航系统
导航系统是用来帮助寻找最短路线并移动的系统。
它能帮助我们从现在的位置移动到目的地。
首先我们需要把游戏中静止不动的物体(环境)设置为导航静态物体(NavigationStatic),之后打来 Navigation 窗口设置角色的半径、高度、爬坡、台阶等属性和移动方式,最后进行烘焙,这样在 unity 自动生成的网格上就可以通过代码实现自动导航。
导航网格的烘焙一旦形成就不要去更改场景中物体的位置,不然人物在移动过程中
会出现被空气墙挡住和穿模的问题。
要注意,单纯通过导航系统移动是模型发生的简单的平移操作,因此在代码中需要我们播放人物移动的动作并且在导航时不要修改人物的位置属性。
本次开发由于场景相对复杂,只保留了主要道路的网格烘焙,在室内等地方将无法使用导航。
接取任务后,会保存导航目的地的位置信息,如果玩家选择导航会自动向目的地
移动。
5.8 灯光系统
Unity 引擎内置的光照系统 EnLighten 负责场景中灯光的构建,没有灯光时默认灰暗。
Unity 的灯光组件分为光源组件和烘焙组件。
添加 Directional Light,Point Lignt,Spot Light 的其中一个组件后,物体可以自行发光Error! Reference source not found.。
1.平行光(Directional Light),模仿太阳光线,场景中所有物体都会受到这个光照的作用并且光照强度是相等的。
Unity 创建场景时便会附带一个平行光照,它的旋转可以用来模拟昼夜交替。
2.点光源(Point Lignt)会从挂载对象的中心向四周发射光线,一般用来制作火把、室内灯具。
点光源主要受到范围(Range)和强度(Intensity)两个参数的影响。
和平行光不同,点光源产生的效果也会受到挂在对象的位置的影响,距离越近光照越强,距离过远就会消失。
3.聚光灯(Spot Light)会从中心向某一个方向发出类似于手电筒的光纤,受扇形角度(Angle)和范围(Range)两个参数的影响。
本次开发中夜晚开启的路灯,用到了聚光灯。
4.区域光(Area Light)与上面 3 个光源都不同,它在于只用于烘焙。
而前面三种既可以在实时(RealTime)又可以烘焙(Bake)的情况下使用。
实 Unity 场景中,光线是相互作用的,如果光线照射到一个物体上,物体反射出的光线会照射到周边的物体上,这种效果是用全局光照(Global Illumination,GI)系统来进行计算并处理的,它能给场景提供强烈的真实感,全局光照在 Unity 默认是开启的。
5.9 着色器 Shader
5.9.1 固定管线着色器。