APP下载

基于Unity的飞船大战游戏设计与开发

2021-08-09郭欣桐

科技资讯 2021年11期

郭欣桐

摘  要:该文讲述了基于Unity的飞船大战游戏的设计与开发过程,游戏以第三人称视角控制主角躲避太空陨石进行游戏对战。该系统以Unity为开发平台,加载三大游戏场景,即游戏开始场景、游戏关卡场景以及游戏结束场景。使用C#编程语言实现主角以及陨石的移动、主角发射炮弹攻击、主角与陨石碰撞以及炮弹伤害计算等游戏状态控制以及游戏核心功能。该系统最终实现了整个游戏流程通过友好的人机交互界面以及相关操作,增强用户的游戏乐趣,利用碎片化时间缓解压力、休闲放松。

关键词:游戏制作  Unity  C#  飞机大战

中图分类号:TP311.5                      文献标识码:A文章编号:1672-3791(2021)04(b)-0067-03

Design and Development of Ship War Game Bsed on Unity

GUO Xintong

(Heilongjiang college of business and technology, Harbin, Heilongjiang Province, 150025  China)

Abstract: This paper describes the design and development process of the spacecraft war game based on Unity. The game controls the protagonist to avoid the meteorite from the third person perspective for game to battle. The system takes Unity as the development platform, loading three major game scenes, the game start scene, the game level scene and the end of the game. The game state control and core functions of the game, such as the movement of the main character and meteorite, the attack of the main body launching shell, the collision between the protagonist and meteorite, and the shell damage calculation, are realized by using C # programming language. The system finally realizes the whole game flow through friendly human-computer interaction interface and related operations, enhance the user's game fun, and use fragmented time to relieve pressure and relax leisure.

Key Words: Game making; Unity; C#; Aircraft war

隨着电脑用户的不断增多,电脑游戏逐渐成为人们主要的休闲娱乐方式。根据现代人对电脑游戏的需求,设计开发一款游戏内容轻度、简单易操作的飞船大战游戏。Unity3D作为目前主流的3D游戏开发引擎,集图形、音频、物理和网络等多功能为一体,可编辑地形、搭建3D场景、通过其强大的物理引擎,模拟更加逼真的场景,增强游戏的真实性[1-2]。故该游戏采用Unity平台,搭建3D场景,选用Unity编程语言C#实现游戏基本流程以及核心功能。游戏类型定位为PUZ,即益智类游戏,采用第三人称视角,游戏规则简单,操作易上手,受众面较广。通过友好的人机交互界面以及玩家自身的游戏操作,达到增强用户游戏乐趣,利用碎片化时间缓解压力、休闲放松的目的[3]。

1  游戏设计开发准备

1.1 开发工具以及编程语言

Unity3D是一款功能强大,一次性多平台开发的交互式游戏引擎。Unity3D采用简洁的图形化界面。其内置的Nvidia公司的PhysX物理引擎可模拟刚体碰撞、粒子模拟、重力等物理效果,使对象物体具备质量、摩擦力等物理属性[4]。Unity3D支持一次性多平台且跨平台对决,2018年该引擎已经扩展到支持超过25个平台[5]。

Unity3D支持C#和JavaScript两种脚本语言编写unity项目程序,U3D官方团队基于数据分析得出结论:目前,80.4%的Unity项目程序使用C#语言编写,U3D文档、示例等相关的支持重点在C#语言。故该游戏项目采用Unity平台,C#语言开发。

1.2 游戏规则

该游戏共有两个游戏角色:太空飞船以及太空陨石。其中太空陨石为随机生成,游戏玩家不可控制,在游戏过程中,太空陨石生成后会自动寻找太空飞船,进行攻击,陨石会随着游戏的进度不断变多,攻击速度变快。游戏玩家可通过键盘上的方向键,操作飞船在上、下、左、右这4个方向进行移动,躲避太空陨石,也可发射炮弹消灭陨石保护自己,游戏刚开始玩家没有炮弹,需按下键盘上的空格键方可触发发射炮弹。若太空陨石碰撞至飞船,飞船护甲防御值降低10点,当护甲值为0时,飞船爆破,即游戏失败。游戏采用回合制,10 min一回合,若在此期间,飞船护甲值一直大于0,则游戏胜利。

1.3 游戏素材设计

游戏的素材设计主要指的是游戏场景对象UI设计以及音频。游戏场景对象包括游戏进入界面按钮和背景、游戏结束界面按钮和背景。设计结合“太空”主题,使用Photoshop图像编辑软件进行编辑处理,主要用到的功能工具有:“钢笔”工具勾勒轮廓,“文字”工具绘制按钮显示文字,“斜面和浮雕”结合“高光和阴影”“线性渐变”,创建出立体感、满足太空主题深邃的视觉感。所有UI设计素材导出格式为png格式,背景透明。

需要编辑的游戏音频包括游戏背景音乐、点击按钮音效、游戏胜利、飞船发射子弹、子弹击中陨石、陨石击中飞船、护甲值降低、游戏失败。搜索相关音频资源后,使用会声会影编辑工具对音频资源进行剪辑,删除多余的音频部分,保留合适的时间长短音频。所有音频导出格式为mp3,保证音频质量。

2  游戏功能开发

2.1 游戏场景搭建

游戏的场景搭建主要包括游戏基本素材添加、UI界面。场景UI界面使用Unity的GUI工具进行创建[6]。

游戏开始场景所需的按钮为“开始游戏”按钮、“退出游戏”按钮,玩家通过点击“开始游戏”按钮进入游戏关卡,开启游戏过程,点击“退出游戏”按钮时直接关闭游戏应用程序。当“开始游戏”按钮被触发时,即鼠标点击该按钮时,程序执行unity内置OnMouseEnter函数,在该函数中添加unity内置Application.LoadLevel函数用于加载游戏关卡场景,但游戏关卡场景需添加至File菜单Build Settings的关卡列表中,使用索引数加载关卡。

游戏关卡为该游戏的重要场景,整个游戏核心功能都依托于此游戏场景。该场景涉及的游戏基本素材为玩家飞船、太空陨石、游戏背景、灯光、飞船子弹。将玩家飞船、太空陨石、游戏背景直接导入并拖拽至编辑环境并调整玩家飞船的旋转角度,使其正常显示在unity相机的区域中。为了模拟真实飞船的情况,增强用户体验度,在飞船尾部使用Unity预制件添加火焰喷射效果。但此时飞船纹理特性并不明显,亮度过暗,需添加灯光,增强飞船亮度,突出飞船纹理。Unity共提供4种灯光效果:Directional(方向光源)、Point(点光源)、Spot(聚光灯)、Area(区域光)。4种灯光效果具有不同特性及应用场景。由于飞船对象在游戏过程中需要移动,位置不固定,故需要采用Directional(方向光源),方向光源由于没有真正的光源坐标,放置在场景任何地点都不会影响光的效果,只有旋转会影响定向光的照射结果,因此即使飞船改变位置,离方向光源较远,都不会影响表面投影光照效果。新建object,创建长方形作为子弹,将子弹图片拖拽至长方形材质球处,将Shader处设置为additive用以去除子弹的背景黑框。陨石的添加方式与子弹类似,在Unity中新建gameObject,将陨石拖拽至该gameObject处。

游戏结束场景所需的按钮为“重新开始”按钮、“退出游戏”按钮。玩家通过点击“重新开始”按钮可重新进入游戏,点击“退出游戏按钮”可直接关闭游戏。两个按钮的实现过程与开始场景按钮一致。

2.2 游戏基本功能

2.2.1 飛船控制

飞船控制主要包括飞船移动以及发射子弹。在游戏过程中,玩家可通过键盘上的4个方向键实现飞船在水平和垂直方向的运动。在Unity内置函数fixedUpdate中,通过Input.GetAxis("Horizontal")和Input.GetAxis("Vertical")获取玩家具体按下哪一个方向键,确定飞船的移动方向。将上述两个函数返回值作为三维向量的x、z轴数值,与飞船移动速度进行相乘,计算移动距离,更新向量速度。未避免飞船移出屏幕区域,需对飞船移动范围进行限制,使用Mathf.Clamp函数控制飞船位置。

飞船在移动的过程中可随时发射子弹,故子弹发射点要随着飞机位置的改变同时改变。在unity资源列表飞船游戏对象中添加空的object,作为子物体用于记录子弹发射位置,由于子弹运动方向为飞船的前进方向,故使用transform.forward与子弹移动速度相乘,控制子弹发射。子弹应具有一定的生命周期,即当子弹飞出有效区域后自行销毁以减少不必要的内存开销。为游戏区域添加触发器,当子弹飞出有效区域时,触发事件调用Destroy函数销毁子弹。

2.2.2 陨石控制

陨石控制主要包括陨石的随机生成以及移动。在游戏过程中,陨石随机生成,且按照随机的角度旋转。

陨石已在场景搭建时添加至场景中,为了让陨石更加逼真,添加旋转效果。旋转效果通过使用Random.insideUnitSphere得到随机的二维向量,为了让旋转效果更佳明显,将该二维向量乘以5作为陨石的旋转角度。

设置陨石为预制件,为增强游戏的趣味性,陨石成波(6个为一波)出现,设置两波陨石的时间间隔,在规定的时间间隔内程序使用Instantiate函数随机生成预制件陨石,但为了防止同一拨陨石距离较近,导致陨石之间相互碰撞销毁,使用协程类函数WaitForSeconds,确保每个陨石对象生成的时间间隔。

陨石的运动与子弹的运动实现过程类似,只是运动方向相反,将运动速度设置为负值即可。

2.2.3 游戏对象碰撞

各个游戏对象之间执行不同的碰撞规则。当子弹与陨石相互碰撞时,陨石爆炸消失。当飞船与陨石相互碰撞时,飞船护甲值降低。且以上对象进行碰撞时,不能穿透对方。因此,需将子弹、陨石、飞船添加碰撞体组件,设置碰撞检测。飞船因其形状不规则,故添加Mesh Collider网格碰撞体,并勾选Convex和Is Trigger选项框,将Mesh Collider设置为触发器。为避免飞船受重力影响,向下掉落,添加rigidbody刚体,使飞船自身重力失效。子弹以及陨石形状较规则,因此添加Capsule Collider胶囊碰撞体,勾选Is Trigger设为触发器,根据子弹和陨石的大小设置胶囊碰撞体的半径与高度,使子弹和陨石包裹在碰撞体之间即可。方向为Z-Axis。

所有的游戏对象都通过OnTriggerEnter函数实现物体碰撞消息传递。在该函数中,使用if函数判断碰撞物体的“Tag”标签,判断碰撞物是子弹、陨石、飞船具体哪一个。根据碰撞物物体进行积分计算、护甲计算。

2.2.4 积分、护甲显示

积分与护甲的显示通过unity中的Text组件实现。添加Text组件后,调整组件位置至屏幕左上角,方便玩家直观查看积分以及护甲值。使用if语句判断,当飞船发射子弹击中陨石后,积分增加,分值增加后更新Unity中的Text组件显示。当陨石击中飞船时,护甲值较少,分值较少后更新Unity中的Text组件显示,当护甲值为0时,游戏结束。

3  结语

该文通过Unity实现了飞船大战游戏的设计与开发。该游戏主要的游戏角色为飞船与陨石,玩家可操作飞船进行移动、攻击,随机生成移动的陨石。在游戏过程中,玩家可通过游戏程序内部游戏对象碰撞消息的传递,在屏幕左上角查看更新的积分、护甲值。经测试,游戏可在PC端流畅运行,游戏各项功能正常。该游戏操作简单,适合各个年龄阶段人群。

参考文献

[1] 尹大伟,张熙若,李欢欢,等.基于Unity3D的虚拟校园漫游系统及其关键技术研究[J].软件工程,2019,

22(9):17-19.

[2] 朱晴.Unity3D开发工具在3D游戏开发中的应用[J].电子技术与软件工程,2019(22):58-59.

[3] 刘硕,王海森,李其伟,等.基于Funcode平台的儿童益智类游戏设计与开发[J].软件,2020,41(8):52-55.

[4] 吴可玉,庄建军,徐琳玲.基于Unity3D的虚拟消防与安全教育系统[J].实验技术与管理,2020,37(12):

237-240.

[5] 周雪薇.基于Unity3D的小学科学教育游戏的设计与开发[J].微型电脑应用,2021,37(1):44-46,51.

[6] 周正.基于Unity3D的冒险闯关类游戏的设计与实现[J].电脑知识与技术,2020,16(21):90-91.