关键词不能为空

当前您在: 主页 > 英语 >

塔防游戏说明

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-02-09 10:54
tags:

-

2021年2月9日发(作者:坑爹英文)



塔防游戏非常地受欢迎,木有什么能比看着自己的防御毁灭邪恶的入侵 者更爽的事了。



在这个包含两部分的教程中,你将使用


Unity


创建一个塔防游戏。



你将会学到如何:



?



?



?



创建一波一波的敌人



使敌人随着路标移动



创建和升级防御塔,并将敌人销毁



最 后,你会有一个此类型游戏的框架,之后可在此基础之上进行扩展。




最终效果



在本篇教程中,你将创建一个塔防游戏,敌人(小虫子)会朝着你的饼干移动,你可以在一


些战略点上,使用金币放置和升级你收下的小怪兽来进行防御。


玩家必须在小虫子抵达饼干之前消灭它们,敌人会随着波数的增加而变得更加强大。



游戏


将在玩家在所有波数之后存活下来(游戏胜利),或者有< /p>


5


个敌人抵达饼干之后结束


(游戏


失败)。



下面是一张完成的游戏截图


:






准备开始



如果你还没有


Unity5


,请从


Unity

的官网下载。



同时,


下载这个< /p>


starter


项目,


解压缩并且使用< /p>


unity


打开


TowerDefens e-Part1-Starter


这个工程。



starter


项目中包括了美术和声音资源,同时还有预设的动画以及一些帮 助用的脚本,这些


脚本跟塔防游戏没有直接的关系,


所以不会再 本教程中详细介绍。


但是如果你想要更多的学


习关于

< p>
unity 2d


动画的创建,请参考


Unity 2D


教程。



项目中同时包含了一些



prefab


供你稍后扩展用来创建游戏角色。最后,工程中包含背景



UI


设置好的场景。



Scenes


文件夹中找到并打开


GameScene


,


设置


Gam e


视图的显示比例为


4:3


来保证


labels


能够正确的在背景中对齐,你在


Game


视图中看到的应该如下所示


:






注:一开始我也没弄清楚什么意思,后来理解了是在




这里所示的窗口



Starter project



check!


Assets



check!


走向征服世界的第一步


(


你的塔防游戏


...)


已经准备好了


!



可放置点的


X


标记



小怪兽只能放在标记有


X


的地方。




Project Brower


中拖 动


ImagesObjectsOpenspot


到场景中,目 前来说放到哪个


位置没有关系。



在< /p>


Hierarchy


中选中


Opensp ot


,在


Inspector


面板点击



Add Component


并且选




Physics


2DBox


Collider


2D



Unity

< br>将会在场景中以绿色的线显示盒子碰撞器。


你将会使用这个碰撞器来检测在某个点 的鼠标点击。






使用相同的步骤,


添加一个


AudioAudio


Source


组件到



Openspot


上。


并且设置


Audio


Source’s AudioClip





tower_place


(可以在


Audio


文件夹中找到),记住不能


勾选


Play On Awake




你需要再创建


11


个放置点,每个都得重复上面的步骤,不过不用担心,


Unity


有一个很好


的解决办法

< br>: Prefab





OpenSpot



Hierarchy


拖动到


Project Browser


里 面的


Prefabs


文件夹,它的名


字 在


Hierarchy


将会变成蓝色,用来标示它是和一个


prefab


相关联的。像下面这样


:



现在,


你拥有了一个


prefab



你就可以创建任意多的拷贝。


简单的将


Openspot


< br>Prefabs


文件夹中拖拽到场景中,再重复


11


次,一共在场景中创建


12


个放置点。



下面使用


Inspector

< p>
面板来分别设置这个


12


个放置点的坐标如下


:



?



?



?



?



?



?



?



?



?



?



(-5.2, 3.5, 0)



(-2.2, 3.5, 0)



(0.8, 3.5, 0)



(3.8, 3.5, 0)



(-3.8, 0.4, 0)



(-0.8, 0.4, 0)



(2.2, 0.4, 0)



(5.2, 0.4, 0)



(-5.2, -3.0, 0)



(-2.2, -3.0, 0)





?



?



(0.8, -3.0, 0)



(3.8, -3.0, 0)



结束后,你的场景应该像下面这样


:



放置小怪兽


(


防御塔

< br>)



为了使放置的工作简单点儿,工程的


Prefab


文件下中包含了一个


Monster



prefab





现在,它包含了一个空的游戏对象,由三种不同的精灵组成, 和他们各自的射击动画。



每一个精灵代表了小怪兽不同的能力 级别。


Monster



prefab


同时包含了一个


Audio


Sour ce


的组件,当怪兽发射激光的时候会触发播放声音。



现在你将创建一个脚本来在


Openspot


上放置一个小怪兽。




Project


Browser



< br>选择


Openspot




Inspector


面板中,


点击



Add


Component


然后选择


New Script


并重命名为


PlaceMonster

< p>
,选择


C#


作为脚本语言并以此点击


Create



Add


。因 为你是向


prefab


添加的脚本,所以场景中所有的


Openspot


都将会被


附件该脚本。





双击刚才创建 的脚本,在编辑器中打开。然后添加下面的这两个变量



public


GameObject monsterPrefab;



private


GameObject monster;



你将使用


mons terPrefab


中的对象实例化一个拷贝来创建一个小怪兽,然后保存在

< p>
monster


变量中,方便之后的操作。



一个位置一个怪兽



添加下面的方法来 限制一个位置只能放置一个怪兽


:



private



bool



canPlaceMonster


()



{




return


monster ==


null


;



}




can PlaceMonster


方法中,我们检查


monster< /p>


变量是否为


null


,如果是的,则表示


当前没有放置小怪兽,所以是允许放置一个的。



再添加下面的代码,来执行当玩家点击鼠标之后放置一个怪兽


:



//1



void



OnMouseUp


()



{




//2




if


(canPlaceMonster())



{




//3



monster = (GameObject)Instantiate(monsterPrefab,


on, ty);




//4



AudioSource audioSource =


ponent();



eShot();





//todo: Deduct gold



}



}



上面的代码在玩家点击或者


Tap


的时候放置一个怪兽,那么如何工作的呢?


1.



当玩家点击一个游戏对象 的碰撞器的时候,


Unity


会自动的调用

OnMouseUp


方法



2 .


当被调用之后,这个方法会检查是否可以放置怪兽,如果可则放置一个新的怪兽



2.



使用



Instantiate


方法创建一个怪兽对象,这个方法会根据指定的


prefab


和指定的位


置和旋转角度创建一个对象。在本例中,我们拷贝了


monsterPrefab



,并指定了当前 游


戏对象的位置,以及没有旋转,最后将结果转换为


GameO bject


类型存储在


monster


变量


中。



3.



最后,调用

PlayOneShot


方法播放附加在


AudioSou rce


组件上的声音特效。



现在我们 的


PlaceMonster


脚本已经可以放置新的怪兽了,< /p>


但还需要指定


prefab


这个步骤。< /p>





使用正确的


Prefab



在代码编辑器中保存,并返回


Unity




下面给


m onsterPrefab


赋值,首先在


Prefabs


文件夹中选中


OpenSpot


,在


Inspector


面板中,


点击


PlaceMonster


(Script)


组件 的


Monster


Prefab


属性 右边的小圆圈按钮,


然后在弹出来的对话框中选择


Monste r







现在开始游戏,在


X


标记上点击来创建一些怪物


~



升级我们的怪物



在下面的图片中,我们看到怪物在不同的等级有不同的外观




我们需要一个脚本来作为怪物升级系统实现的基础,


来跟踪管理怪物在各个级别的能力大小,


当然还有怪物所处的当前等级。



现在来添加这个脚本






Project Browser


中选中



Prefab s/Monster


,添加一个新的


C#


脚本命名为


MonsterData


,在代码编辑器中打开该 脚本并添加下面的代码在


MonsterData



类的上



:



[izable]





public



class



MonsterLevel



{




public



int


cost;




public


GameObject visualization;



}



这里定义了一个

< br>MonsterLevel


类型,包含了费用(金币)以及对于某个特定等级的视 觉


效果。



我们添加了


[izable]


这个特性来使这个类的对象可以在


i nspector


面板


中编辑。这可以使我们方便快速的改变< /p>


MonsterLevel


中的值,甚至在游戏运行过程中。


这在调节游戏平衡性的时候特别的有用。



定义怪物的等级



我们将预先定义的< /p>


MonsterLevel


存储在


Lis t


中。



为什么不简单的使用数组


MonsterLevel []


呢,首先我们会经常用到某个特定


MonsterLevel


对象的下标,


当然如果使用数组编写一点代码来做这件事也不是特别困 难。


我们可以直接使用


List


对象的


IndexOf()


方法,没有必要重新发明轮子了这次


:]





文件的顶部,添加下面的引用:



using



System

< p>
.c


;



这将允许我们使 用泛型的数据结构类型,所以可以在脚本代码中使用


List





接下来添加下面的变量到


MonsterData


类中,用来存 储


MonsterLevel


的列表


:



public



List


levels;



使用泛型,可以保证


levels


只能存放


MonsterLevel


类型的对象





在代码编辑器中保存文件,并返回到


Unity


中配置每个阶段


.




Project Browser


中 选中


Prefabs/Monster


,然后在


Inspector


面板中我们可以在


Monster Data (Script)


组件看到


Levels

< p>
属性,设置


size



3



接下来,设置每个等级的花费如下:



?



?



?



Element 0: 200



Element 1: 110



Element 2: 120



接下来,给


visualiz ation


赋值。




project browers


中 展开


Prefabs/Monster


来查看其子节点。拖拽子 节点


Monster0



visual ization


属性的


Element 0




重复上面的动作


Monster1



Element 1



Monster2



El ement 2


,参考下面动图中的


演示:






现在, 当你选中了


Prefabs/Monster


,它应该看下像下 面这样子:




定义当前的等级



切换回



中,向


MonsterData

类中添加另外一个变量:



private


MonsterLevel currentLevel;



在私有变量

currentLevel


中,我们存放怪物当前的等级信息。


现在设置


currentLevel

同时将它暴露给其他脚本使用,


添加下面的代码到


Mons terData


中:



//1



public


MonsterLevel CurrentLevel



{






//2




get



{




return


currentLevel;



}





//3




set



{



currentLevel =


value


;





int


currentLevelIndex = f(currentLevel);




GameObject levelVisualization =


levels[currentLevelIndex].visualization ;




for


(


var


i =


0


; i< i++)



{




if


(levelVisualization !=


null


)



{




if


(i == currentLevelIndex)



{



levels [i].ive(


true


);



}




else



{



levels [i].ive(


false


);



}



}



}



}



}



看起来有很多

C#


代码,我们慢慢来看:



1.



为私有变量

currentLevel


定义一个属性。当属性被定义之后,你就能像其他变量一 样去


调用,


既可以


CurrentLe vel


这样在类的内部调用,


也可以使用


tLevel


这样在类的外部调用。然后还能自定义属性的


g etter



setter


方法,通过 只提供一个


getter


,只有一个


s etter


或者都有,来控制一个属性是只读的、只写的或者读写的。

< br>


2.



getter


方法中,直接返回私有变量


currentL evel


的值



3.




se tter


方法中,给


currentLevel


赋值。先拿到当前等级的下标,然后遍历


levels



组依据


currentLevelIndex


的值设置外观的活动或者非活动状态,好处就在于不管什么


时候谁设置了


currentLevel


,精灵会自动更新。



添加下面的


OnEnable


的一 个实现:



void



OnEnable


()



{



-


-


-


-


-


-


-


-



本文更新与2021-02-09 10:54,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/620734.html

塔防游戏说明的相关文章