基于游戏引擎的第三人称射击类案例制作解析
2021-05-13章国雁
章国雁
(安徽工商职业学院 信息工程学院,安徽 合肥 231131)
随着网络的发展、计算机硬件性能的提升以及智能化系统的不断完善,游戏产业的发展也日臻成熟,目前无论是网游还是手游都处在了发展的黄金时期,而射击类游戏在游戏市场有着浓墨重彩的一笔。射击类游戏具有竞技性强的特点,但也兼顾了公平性,以知名游戏《绝地求生》为例,所有玩家在一张地图上竞技,需要玩家自己收集枪械和补给品,玩家可以单人或者组队进行战斗,保持了公平性的同时也加强了游戏的趣味性。游戏行业的发展带动了游戏开发技术的进步,为了提高开发效率,业内普遍采用各类型游戏引擎进行开发,其中主要以Unity3D引擎和Unreal虚幻引擎为主。Unity3D 引擎具有较好的跨平台特性,开发完成后可以轻松部署到十几种平台上,对硬件性能要求低,因而在国内拥有大量的开发者;Unreal虚幻引擎具有较好的画面效果,但对硬件要求较高,普遍用于次世代游戏开发,但随着近些年硬件性能的提高,Unreal 引擎应用越来越广。
众多学者对使用游戏引擎进行游戏开发进行了大量的研究,2018 年张策在文中讲解了使用Unity3D 引擎开发的一款以战车为主体的射击类游戏开发研究与实现;2019 年蔡国宇等人在文中讲解基于Unity3D 引擎人工智能系统制作的一款第三人称射击类游戏;谢宏兰在文中讲解了使用Unity3D 引擎NetWork 组件开发的射击类游戏,实现了局域网的多人对战游戏,增强了游戏的视听效果和乐趣性;2020 年黄冈对基于Unreal 虚幻引擎的FPS 第一人称射击游戏开发与设计进行了研究;陈丽梅等人在文中讲解了基于Unreal 虚幻引擎结合KBE 服务端引擎,使用C++语言与蓝图脚本做客户端开发,实现具有联网功能的第三人称射击动作类游戏。以上研究对于使用游戏引擎进行游戏开发提供了很好的帮助。
1 游戏设计
1.1 案例介绍
本文以Unity3D 引擎官方案例“恶魔射手”为参照讲解其制作过程,案例资源使用Unity官方提供的免费资源,游戏人物主角和怪物模型为卡通风格,游戏场景设置在一间梦幻风格的场所中,摆设有一间屋子、放大的抽屉、椅子、闹钟、玩具汽车以及一些儿童玩具等物件,游戏主角为一个小男孩拿着一把枪,可以做出射击、奔跑、受到伤害、死亡等动画,游戏设置了3 个不同类型的怪物,每个怪物含有生命值、攻击力等属性,可以做出发动攻击、受到伤害、死亡等动画效果。
1.2 游戏功能设计
本案例采用Unity3D 游戏引擎和Visual Stu⁃dio 为开发平台,使用C#为开发语言,游戏主要功能包含以下方面:游戏资源的导入和场景搭建、游戏主角的设置、主角移动功能、生命值、受到伤害及死亡功能、主角射击功能、摄像机的跟随、动画状态机设置和播放、游戏怪物的设置、怪物AI、怪物生命值、受到伤害及死亡功能、背景音乐和音效、游戏界面UI制作等功能。
2 案例开发关键节点
2.1 资源导入和场景搭建
导入下载的官方免费资源包SurvivalShooter,包含了游戏物体模型文件夹Models、音效文件夹Audio、图片资源文件夹Textures、预制体文件夹Prefabs 等。在预制体文件夹Prefabs 中的拖动En⁃vironment 环境预制体到Scene 窗口中,进行游戏场景的搭建。
2.2 游戏主角移动、攻击功能的设置
拖动Models 模型文件夹中的Player 模型到Hierarchy 窗口中,给模型添加Rigidbody 刚体组件和CapsuleCollider 胶囊体组件,刚体组件锁定Freeze Position Y 轴和Freeze Rotation X、Z 轴值,防止主角在Y 轴上产生位移,X 轴和Z 轴产生旋转。
在FixedUpdate()函数中,根据玩家在A、D 按键和W、S 按键的操作,通过输入管理器Input.Ge⁃tAxisRaw()函数获取水平轴Horizontal 和垂直轴Vertical 的值,调用游戏主角刚体组件的MovePo⁃sition()函数实现移动功能,其核心代码如下所示:
当玩家按下鼠标左键时,游戏主角发动攻击,实现思路为:在枪头的位置向前发射一条射线,判断射线与物体是否进行碰撞,如果碰撞的物体为怪物,则怪物受到攻击,减少怪物的生命值,如果碰撞的是其他没有生命值的物体,则不做处理,其核心代码如下所示:
2.3 摄像机跟随功能
当游戏主角进行移动时,为了方便玩家进行游戏控制,摄像机需要保持跟随状态。摄像机实时跟随主角移动,镜头画面容易产生过度的晃动,造成玩家视觉上眩晕的问题,为了避免这一情况,我们通过使用插值函数来保障摄像机的平稳位移,其核心代码如下:
2.4 动画状态机设置和播放
当游戏物体进行移动、攻击、受到伤害、死亡等动作时,需要同时播放相应的动画效果,我们使用Unity3D引擎中的Mecanim 动画系统进行制作,以游戏主角Player 为例,我们进行动画状态机的设置,其详细步骤如下:(1)在Project 窗口中创建动画状态机控制器PlayerAnimatorController;(2)在Animator 窗口中,创建游戏主角Player 物体的空闲状态机Idle、移动状态机Move 和死亡状态机Death;(3)创建状态机的转移条件参数Iswalking(是否移动)和Die(是否死亡),类型均为布尔值Bool;(4)连接状态机之间的条件转移,其转移条件为:当Iswalking 为真True 时,Idle->Move 转移;当Iswalking 为假False 时,Move->Idle 转移;当Die为真时,Any State->Death 转移。状态机创建完成后,如图1所示。
图1 创建动画状态机
2.5 游戏怪物的设置
怪物物体需要添加刚体、胶囊体碰撞器、球形触发器、NavMeshAgent 导航网格、声音来源等组件,刚体组件用于实现怪物的移动功能,胶囊体碰撞器避免物体之间相互穿插,触发器检测玩家是否进入攻击范围,NavMeshAgent 导航网格用于怪物自动寻路,让它具有一定的AI 功能,声音来源组件用于播放怪物相关的音效。
3 游戏发布和测试
游戏的功能开发完成后,还需要对游戏进行发布和测试,根据测试结果进行进一步的优化。我们对所制作的游戏进行发布到PC平台上,运行后游戏画面效果如图2所示。
图2 游戏画面
4 结束语
本案例讲解了Unity 官方第三人称射击类案例的制作过程,包含了主角攻击和怪物攻击、怪物AI 等核心功能,但目前为单机版本,游戏的趣味性有限,后期可以此为基础进一步扩展功能,添加游戏服务端,制作多人在线联网版本。本文针对第三人称射击类案例的制作解析,对于游戏开发研究具有较好地实用性。