基于Unity3D开发Survival shooter的实现

2018-01-15 09:52王涛王晓博
智富时代 2018年11期

王涛 王晓博

【摘 要】本文阐述了一个基于Unity3D开发的射击类游戏,重点实现了碰撞检测、敌人智能跟踪、动画设置、声音播放等功能,UI搭建方面实现了界面的制作、玩家血量条、玩家分数记录和音量界面的制作。

【关键词】Unity3D软件;射击类游戏;UI界面

1.引言

小游戏作为电子游戏家族中的一个独特成员,在其中扮演着重要的角色。通常以休闲益智类为主,主要分为单机版和网络版。本次开发的噩梦射手就是属于休闲小游戏,正是迎合了当前游戏产业,具备良好的发展前景。

2.游戏系统设计

2.1 场景搭建

游戏素材来自于Unity引擎中自带的资源商店,在搜索界面输入Survival shooter就可以搜索到本题的素材,通过下载导入就可将游戏素材导入到Unity资源文件中。根据原场景进行场景搭建,搭建场景的所有游戏对象都会在Hierarchy视图中显示出来,方便开发者对场景随时进行更改与调整。

2.2 场景中的物理检测设置

游戏中能够发生碰撞的物理引擎是Collider组件,受到重力、摩擦力和角摩擦力的是Rigidbody组件,当给游戏中的对象加上这些组件的时候,他们就会模拟出现实世界中的一些物理现象。

在物理引擎中,两个物体发生碰撞的条件是:两个物体都具有碰撞器,并且一个物体必须带刚体,而且两个物体发生相对运动,这是在Unity的物理引擎中产生物理碰撞的必要条件。

2.3 UI界面的制作

在本题中游戏界面中显示的有玩家的血量和得到的分数记录,当按下ESC键会弹出声音控制面板和结束暂停重新开始界面。

3.游戏功能实现

3.1 主角的移动

通过获取虚拟轴来实现主角的移动,水平虚拟轴和垂直虚拟轴,水平虚拟轴对应了键盘上的A、D,垂直虚拟轴对应了键盘的W、S。获取到他们,将它们赋值给主角的位置,这样就可以在按下W、A、S、D让主角移动了,其本质就是改变了主角在三维世界中的位置来达到移动的目的。

3.2 主角的转向

主角的转向是通过鼠标来控制的,由于鼠标是在屏幕上的,因此首先要将鼠标的位置转换到世界坐标中,在本题中通过射线检测的方法与四元数的转向的方法来让主角转向并且很自然的转向。

3.3 主角的动画播放

通过直接拖拽的方式将主角的动画添加到这个面板中,在游戏刚开始时,不移动主角时,我们就会让主角执行一个闲置的状态,当按下W、A、S、D中的任何一个时,主角就会播放移动的动画,此时在主角的这个游戏对象的属性面板上加上一个Animator组件,然后将我们创建的这个动画状态机添加给Animator组件,这样就这两个组件连接在一起了,最后在主角的这个脚本中将这个组件拿到,加上一些判定,在适当的时候来播放这个动画就可以了。

3.4 主角的射击

主角的射击是通过鼠标来控制的,当玩家按下鼠标左键的时候,主角会对敌人进行射击,在本题中,主角射出是一条线段,这个线段有一个最远距离,也会给场景中的所有对象添加一个层(ShootableMask),也会将敌人添加这个层中,当主角打到这个层中的任何一个对象是,这个线段就会以这个对象作为终点,否则射线就会打到最远的距离。

4.敌人的产生、移动和动画播放

4.1 敌人的产生

先在已经搭建好的场景中创建三个空的游戏对象,将它们放置在想要敌人生成的地方,然后再创建一个空的游戏对象来管理这三个位置,将在这个空的游戏对象挂在一个实例化敌人的脚本,其次要将素材中的敌人设置好做成预设体,在脚本中拿到预设体和将要产生敌人的位置,这样敌人的生成就可以了。

4.2 敌人的移动是通过自动寻路来寻找主角的。

使用Unity中自带的导航系统,可以让敌人自动寻路,只要在一开始的时候给敌人一个主角位置,之后就会跟着主角的移动来移动。

4.3 敌人的动画播放

敌人的动画的逻辑是,当游戏开始时,给敌人加上移动的动画,动画参数选择Trigger类型的参数,這是从移动的动画到闲置状态的动画之间的切换,它的触发条件就是当玩家死亡的时候,而敌人死亡的动画是无论是在移动状态下还是闲置状态都会触发,所以要将死亡的动画加在任何状态的状态上,这样就可以随时触发这个动画了。

4.4 主角与敌人攻击逻辑的实现

主角攻击与主角的健康,在前面提到过主角的射击,而主角攻击就是用枪来射击敌人,并且给枪设置的每发子弹是20点伤害,玩家的血量设置的是100点血量,在实现开始前记录一个当前玩家的血量和初始血量。

敌人的攻击与健康,每一个敌人的游戏对象身上都会具有一个触发器,当敌人接近主角的一定范围时,敌人就会对玩家发起攻击,本题中,敌人的攻击是10点伤害,血量也是100点上限,在开始前也记录一个当前敌人的血量和初始血量。

4.5 UI界面的搭建与代码之间的关联

UI界面的搭建也是游戏制作的重要部分,首先我们先创建一个Panel,并且将它的大小设置与画布大小一样,它有一个Image组件,里面有一个Color的属性,将颜色改变为红色,然后将它的透明度设置为0,这样我们在游戏开始时就会看不到。颜色的改变我们就通过主角的健康脚本用代码来实现,首先我们先获取到这个能改变这个Panel颜色的组件Image组件,并且要给这个组件赋一个初始值,就是主角受到攻击以后,颜色显示为这个初始值,如果没有受到攻击,我们就让颜色通过一个Color.Lerp()的方法渐变为透明,其中,这个方法有三个参数,第一个参数就是主角受到攻击时的颜色,第二个参数就是Color.clear,第三个参数我们会给一个这个颜色从主角受到攻击时的颜色到透明的一个渐变的速度,因此我们会在刚开始的时候给一个渐变速度,让这个速度在乘以一个Time.deltaTime,这样就是显得很平滑,不至于突兀。

接下来是主角的血条制作,我们使用的一个是叫Slider的游戏组件,他是一个滑动条,这个组件上有Interactable、Min Value、Max Value、Value属性,其中第一个属性是是否可交互,默认为True,如果将其改为False将不能与代码鼠标完成交互,第二个是这个滑块的最小值,第三个是这个滑块的最大值,第四个是这个滑块的值,默认是0到1,在本题中,我们将主角的值设置为了100,因此我们将这个滑块的最大值改为100,用来现实主角的血量。

在主角健康的脚本中将主角当前的血量赋值给这个Slider组件,这样在游戏开始时主角受到攻击时,那个血量就会根据敌人的攻击来减少。

主角所得分数的计算,写一个脚本挂载到显示分数的文本上,通过这个脚本来获取每个敌人死亡后的分数。

最后就是我们的音量面板和游戏暂停面板,跟上面的做法一样,在画布上选择一些Slider游戏,不过在这又用了两个新的游戏对象,一个Button游戏对象,一个Toggle游戏对象,Button游戏对象是可点击的按钮,在这通过ESC键可以呼出这个面板,最下方有一个继续游戏(Resume)按钮,一个离开游戏按钮(Quit Game),在上面就是一个是否开关声音的Toggle游戏组件,当取消这个按钮时,我们的游戏界面将没有声音,在上面就是通过我们的Slider游戏对象来实现的。通过与代码的交互,我们就可以实现以上所说的这些。

5.总结

本次设计的第一人称射击的休闲类小游戏,功能单一,后期会逐步完善。

【参考文献】

[1]吴志达.基于Unity3D游戏引擎的游戏研究与实现[D].中山大学,2012.

[2]李锦荣,郭磊,谭忠扬.基于Unity3D平台的射击游戏的开发[J].福建电脑,2015(02)171-173.