APP下载

基于Unity3D的2D塔防游戏设计与实现

2021-10-16张宝宝

现代信息科技 2021年7期
关键词:脚本关卡怪物

摘 要:Unity3D是当前国内外广泛使用的游戏开发软件,其所开发出的塔防游戏自游戏发展以来就十分盛行。该项目基于Unity3D开发了一款塔防游戏。其主要功能包括防御塔放置、敌人孵化、关卡管理、音效控制、UI界面以及最后的积分管理。该项目摒弃了传统关卡设计,通过关卡内的难度上升而达到提升游戏难度的目的。通过该项目,可以让玩家体验到难度层层递增、挑战性极强的塔防游戏。

关键词:Unity3D;C#;塔防

中图分类号:TP311      文献标识码:A    文章编号:2096-4706(2021)07-0071-04

Design and Implementation of 2D Tower Defense Game Based on Unity3D

ZHANG Baobao

(School of Computer and Software,Jincheng College of Sichuan University,Chengdu  611731,China)

Abstract:Unity3D is game development software that is widely used at home and abroad at present. Tower defense games developed by it are extremely popular since the development of games. This project develops a tower defense game based on Unity3D. Its main functions include defense tower placement,enemy hatching,gate management,sound effect control,UI interface,and the final points management. Instead of traditional gate design,this project aims to increase the difficulty of the game by increasing the difficulty within the gate. Through this project,players can experience the tower defense game with increasing difficulty and strong challenge.

Keywords:Unity3D;C#;tower defense

收稿日期:2021-03-10

0  引  言

随着电子产品的普及和发展,游戏技术也随之得到了很大的提升。在游戏引擎和玩法方面,目前的游戏行业水平都达到了空前的高度。其中塔防类游戏得到了很多玩家的喜爱,不管是自身还是敌人都可以随着关卡的进行得到能力的提升。

1  开发工具及技术

Unity3D是由Unity公司设计的一款游戏引擎,在其中可以进行2D及3D游戏的设计与开发。该平台同时支持主机、手机、PC等设备的游戏开发。目前国内外有相当多的游戏制作组使用Unity开发了很多优秀游戏。本项目游戏脚本开发采用C#语言,使用VS2019版本,设计了一款基于Unity3D的塔防游戏,实现了怪物AI、防御塔攻击算法的设计以及众多特效等。

2  游戏策划

本项目的塔防游戏拥有以下几个规则:

(1)玩家可以使用金币在建筑方块上建造防御塔,但是每建造一次,金币的消耗便会随之增加。

(2)怪物会从不同的方向生成,并且会通过不同的路径走向玩家的核心。怪物每生成一次,其攻击力、防御力及每次的个数都会有所提升。

(3)玩家每击杀一个怪物则会获得金币和血量的奖励,但是此奖励会逐渐减少。

(4)怪物一旦碰到核心便会对其造成伤害,核心血量达到0,游戏便结束。

游戏流程如图1所示。

3  游戏主要功能模块详细设计与实现

3.1  场景搭建及功能设计

本項目使用Unity中的TileMap功能进行场景的绘制。此功能也是Unity为2D游戏提供的一个便于绘图的功能。我们把将要使用的方块素材放置到一个类似于“颜料板”的窗口后,便可以使用笔刷蘸取不同的方块素材在画布上进行绘制。这样绘制出来的地图会成为一个整体。主要分为整体系统的设计、防御塔的设计和怪物的设计三大类。游戏功能如图2所示。

3.2  炮塔的设计

3.2.1  加农炮的设计

加农炮是游戏里常见的一种大炮类型,在项目里面的加农炮分为了上下两个部分,一个底座一个炮管,之所以要这么设计,是为了在实现炮管旋转时能够更加真实。我们需要在炮管上设置一个圆圈形的触发器,这代表着防御塔的攻击范围,在代码里面要设置一个OnTriggerEnter2D的函数,用来捕捉到进入触发器的对象,如果为敌人则将记录敌人数量的参数加1。在2D游戏中,无法使用transform.lookat的方法,为了让炮管能够始终朝向敌人,则需要设置OnTriggerStay2D函数,在这个函数中获取敌人和炮管的位置差值,利用差值算出炮管和敌人之间夹角的正切值,然后再利用这个正切值使炮管能够旋转。主要代码为:

Vector2 direction=collision.transform.position-transform.position;

float angle=Mathf.Atan2(direction.y,direction.x)*Mathf.Rad2Deg;

transform.rotation=Quaternion.AngleAxis(angle,Vector3.forward);

当敌人离开触发器范围时,在OnTriggerExit函数中使记录敌人数量的参数减1。同时为了让炮管能够发射子弹,则为发射子弹功能建立一个协程函数,便于控制射击的调用和时间间隔。协程函数代码为:

IEnumeratorfireCor()

{while (true)

{yieldreturnnewWaitForSeconds(0.5f);Instantiate(bullet, shotpoint.transform.position, gameObject.transform.rotation);}}

并且在Update中檢测敌人数量来开启、关闭协程。子弹本身会朝着自身的X轴移动,一旦发射出来便会向着炮管瞄准的方向射击。只要子弹碰撞到敌人,则会调用敌人身上的受伤函数。

3.2.2  火塔的设计

火塔在游戏中是一个能够造成持续伤害的防御塔。火塔相较于加农炮多了一个火焰特效的设计。将不同火焰燃烧的图片建立为动画的不同关键帧,在播放的时候就会形成火焰燃烧的效果。在火塔中也需要一个圆形触发器,同样也是作为火塔的攻击范围。在脚本中利用OnTirggerStay2D函数来进行敌人对象的捕捉和检测。一旦检测到敌人便会调用敌人身上的受伤函数。动画制作如图3所示。

3.3  核心的设计

本游戏的核心设计为一颗心脏样子,首先要为其添加动画。在动画中的不同关键帧上使心脏对象的大小有所调整,这样就会形成一颗心脏跳动的效果。然后为其添加触发器,使得心脏能够和敌人发生碰撞。

3.4  敌人控制

3.4.1  敌人的设计

在敌人的身上也有类似于核心的动画设计,使其运动时看起来更加逼真。在敌人的身上有一个受伤函数,函数的参数则为受到的伤害,敌人会根据防御值和伤害来计算出实际受到的伤害。敌人如图4所示。

3.4.2  敌人的孵化

在需要敌人孵化的点处放置空对象并且编辑脚本。在脚本中需要创建两个计时器,第一个计时器用来计算一次内怪物的孵化间隔,如果到了孵化间隔,则生成怪物到指定的位置,将怪物生成计数加1,并且将计时器复原。第二个计时器则是用来计算每一次怪物生成的间隔,如果第二个计时器大于等于每次间隔,则使其复原,将每次敌人数量增加,并且利用全局变量改变敌人的防御值。主要代码为:

time2+=Time.deltaTime;

if (time2

{time+=Time.deltaTime;

if(time>rate)

{Instantiate(Enemy,gameObject.transform.position-new Vector3(-8.80f,2.34f),Quaternion.identity);count++;time-=rate;}}

if(time2>=timeofEachWave)

{time2=0;maxene+=2;count=0;GlobalValue.instance.enemydefence+=0.1f;AudioManager.instance.PlaySound(next); }

3.4.3  敌人的自动寻路

为了使敌人能够按照一定的路径走向核心,在游戏中采用了路径点的办法,先用一个Transform类型的数组来存放路径点组,在脚本中创建一个MoveToThePoints()函数来实现怪物的移动,代码为:

Vector2 temp=Vector2.MoveTowards(transform.position, theWayPoints[index].position,speed* Time.deltaTime);

GetComponent().MovePosition(temp);

在Update函数中判断是否达到了目标路径点的位置如果没有则调用MoveToThePoints函数,如果到了则将目标路径点设置为下一个。

在游戏中存在一种迅捷怪物,这种怪物采用了另外一种寻路方式,它是利用A*PathFind插件来实现的。首先要在移动路径两旁放置对象,然后在A*PathFind插件中来检测可以行动的范围,在迅捷怪物上添加插件中的移动脚本,并且将目标设置为核心,这样怪物就会通过最近的路径移动到核心,从而加大游戏的难度。

3.4.4  敌人的血量及死亡

不管是火塔攻击还是子弹的碰撞都会调用敌人脚本中的受伤函数,敌人在受到伤害时会进行一定的防御计算,如:health -= (dam / GlobalValue.instance.enemydefence);。如果敌人的生命值小于等于0,则会触发音效、摧毁敌人并提供奖励。在OnTriggerEnter2D中如果碰撞到了核心则会使玩家受伤,并且会让加农炮的敌人记录数减少。代码为:

if (collision.gameObject.transform.CompareTag("Player"))

{GlobalValue.instance.hurt(damage);

Cannon.instance.enenumcost();

Destroy(gameObject);}

3.5  游戏UI、音效及管理

3.5.1  游戏场景切换

当打开游戏时并不会直接开始游戏,首先会有一个开始的场景,有游戏的名称,并且有开始按钮、帮助按钮等。玩家可以点击不同的按钮切换到不同的场景。当按下帮助按钮后,会切换到游戏规则讲解场景,也可以点击返回按钮返回。当点击开始后,会进入到关卡选择场景。游戏的场景采用的是不断解锁的方式,当玩家一个关卡玩到一定的分数后,会解锁下一个关卡。当玩家点击关卡按钮后则会进入关卡开始游戏。

3.5.2  游戏UI

在游戏进行的时候,游戏会显示当前的金币数量和建造不同防御塔所需的花费。同时玩家的生命值会以进度条的方式显示在顶部。在右上角还有一个暂停按钮,但是由于游戏机制的设定,玩家需要花费500金币来暂停游戏。游戏UI如图5所示。

3.5.3  游戏数据管理

在整个项目中,使用了一个GlobalValue脚本来管理不同的数据,包括建造塔的花费函数等。将所有的数据存放于一个脚本中,便不会出现不同对象使用脚本时,因为数据更改而出现的错误,同时也更加方便管理。

3.5.4  游戏音效

在游戏中,建造防御塔,击杀怪物,每一波怪物生成都有不同的音效。首先要在项目中添加一个AudioManager脚本用以管理整体的音效播放。在其中建立音效播放函数(其参数为需要播放的声音),然后在需要音效的地方调用此函数。并且在摄像机上添加一个AudioSource组件用来播放游戏的BGM。

3.6  游戏脚本

在本项目中,主要使用了游戏管理脚本,全局值脚本,防御塔建造脚本,敌人控制脚本,敌人孵化脚本,敌人寻路脚本,炮塔控制脚本,火塔控制脚本,音效控制脚本,关卡切换脚本等。其中较为重要的是防御塔建造脚本,主要是利用射线检测来判断鼠标点击的方块是否可建造。再根据判断点击左右键来建造不同的防御塔。

4  测试

4.1  测试环境

本游戏制作使用的Unity3D为2018.3.9f1版本,C#脚本由VisualStudio2019进行编写。游戏在显卡GTX970、CPU为i5,内存8 GB的环境下进行测试。

4.2  测试内容

游戏测试内容主要为,让不同玩家通过不同配置的电脑及不同分辨率来进行游戏,查看游戏的UI是否错位,其次通过玩家的反馈来进行游戏难度的调整,让玩家能够体验到游戏难度的坡度上升,并且可以在其中找到乐趣。最后在对比不同玩家得到的分数,来完善最终分数的计算方式。游戏功能如图6所示。

5  结  论

本项目是基于Unity3D开发的一款塔防游戏。主要功能包括防御塔的放置、敌人的孵化和寻路、关卡设计与管理、音效控制、UI界面及最后的积分系统。通过本项目,可以让玩家体验到难度递增的塔防游戏,并且可以通过此游戏得到一个良好的体验。

游戏已经达到了可以畅玩的基本要求,但是仍然还有很多需要改进的地方。在未来还需要优化游戏的代码,使其能够在大量怪物和防御塔存在时,能够使运行更加流畅。其次是增加怪物和防御塔的种类,创作更多新的关卡地图。

参考文献:

[1] 胡静,胡欣宇.基于Unity3D引擎的游戏设计与开发 [J].电子元器件与信息技术,2021,5(2):138-140+154.

[2] 王艳,华唯辰.基于Unity3D的ARPG游戏设计与实现 [J].电脑知识与技术,2020,16(29):199-201.

[3] 周正,司占军,秦雷.开放世界类型游戏的设计与制作 [J].电脑知识与技术,2020,16(22):1-2+7.

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

[5] 岳书丹,陈雪荣.基于Unity3D塔防游戏的設计与实现 [J].电子测试,2020(13):124-126.

作者简介:张宝宝(2000—)男,汉族,四川宜宾人,本科在读,研究方向:VR与游戏开发。

猜你喜欢

脚本关卡怪物
电塔岛历险
疯狂冒险岛
失踪的怪物等
自动推送与网站匹配的脚本
Women in the Workplace, Fighting Spam, Money in the Museum, and the Mood for Food
举一反三新编
捕风捉影新编
曾被误认为怪物的伞
时空穿梭
愚公移山