-
塔防游戏非常地受欢迎,木有什么能比看着自己的防御毁灭邪恶的入侵
者更爽的事了。
在这个包含两部分的教程中,你将使用
Unity
创建一个塔防游戏。
你将会学到如何:
?
?
?
创建一波一波的敌人
使敌人随着路标移动
创建和升级防御塔,并将敌人销毁
最
后,你会有一个此类型游戏的框架,之后可在此基础之上进行扩展。
最终效果
在本篇教程中,你将创建一个塔防游戏,敌人(小虫子)会朝着你的饼干移动,你可以在一
些战略点上,使用金币放置和升级你收下的小怪兽来进行防御。
玩家必须在小虫子抵达饼干之前消灭它们,敌人会随着波数的增加而变得更加强大。
游戏
将在玩家在所有波数之后存活下来(游戏胜利),或者有<
/p>
5
个敌人抵达饼干之后结束
(游戏
失败)。
下面是一张完成的游戏截图
:
准备开始
如果你还没有
Unity5
,请从
Unity
的官网下载。
同时,
下载这个<
/p>
starter
项目,
解压缩并且使用<
/p>
unity
打开
TowerDefens
e-Part1-Starter
这个工程。
starter
项目中包括了美术和声音资源,同时还有预设的动画以及一些帮
助用的脚本,这些
脚本跟塔防游戏没有直接的关系,
所以不会再
本教程中详细介绍。
但是如果你想要更多的学
习关于
unity 2d
动画的创建,请参考
Unity
2D
教程。
项目中同时包含了一些
prefab
供你稍后扩展用来创建游戏角色。最后,工程中包含背景
和
p>
UI
设置好的场景。
在
Scenes
文件夹中找到并打开
GameScene
,
设置
Gam
e
视图的显示比例为
4:3
来保证
p>
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
p>
拖动到
Project Browser
里
面的
Prefabs
文件夹,它的名
字
在
Hierarchy
将会变成蓝色,用来标示它是和一个
p>
prefab
相关联的。像下面这样
:
现在,
你拥有了一个
prefab
,
你就可以创建任意多的拷贝。
简单的将
Openspot
从
< br>Prefabs
文件夹中拖拽到场景中,再重复
11
p>
次,一共在场景中创建
12
个放置点。
p>
下面使用
Inspector
面板来分别设置这个
12
个放置点的坐标如下
p>
:
?
?
?
?
?
?
?
?
?
?
(-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
p>
的
prefab
。
现在,它包含了一个空的游戏对象,由三种不同的精灵组成,
和他们各自的射击动画。
每一个精灵代表了小怪兽不同的能力
级别。
Monster
的
prefab
同时包含了一个
Audio
Sour
ce
的组件,当怪兽发射激光的时候会触发播放声音。
现在你将创建一个脚本来在
Openspot
上放置一个小怪兽。
在
Project
Browser
中
< br>选择
Openspot
,
在
p>
Inspector
面板中,
点击
Add
Component
然后选择
New
Script
并重命名为
PlaceMonster
,选择
C#
作为脚本语言并以此点击
Create
和
Add
。因
为你是向
prefab
添加的脚本,所以场景中所有的
Openspot
都将会被
附件该脚本。
双击刚才创建
的脚本,在编辑器中打开。然后添加下面的这两个变量
public
GameObject
monsterPrefab;
private
GameObject
monster;
你将使用
mons
terPrefab
中的对象实例化一个拷贝来创建一个小怪兽,然后保存在
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>
这在调节游戏平衡性的时候特别的有用。
定义怪物的等级
我们将预先定义的<
/p>
MonsterLevel
存储在
Lis
t
中。
为什么不简单的使用数组
MonsterLevel []
p>
呢,首先我们会经常用到某个特定
MonsterLevel
对象的下标,
当然如果使用数组编写一点代码来做这件事也不是特别困
难。
我们可以直接使用
List
对象的
IndexOf()
方法,没有必要重新发明轮子了这次
:]
在
文件的顶部,添加下面的引用:
using
System
.c
;
这将允许我们使
用泛型的数据结构类型,所以可以在脚本代码中使用
List
。
接下来添加下面的变量到
MonsterData
类中,用来存
储
MonsterLevel
的列表
:
public
List
使用泛型,可以保证
levels
只能存放
MonsterLevel
类型的对象
。
在代码编辑器中保存文件,并返回到
Unity
中配置每个阶段
.
在
Project Browser
中
选中
Prefabs/Monster
,然后在
Inspector
面板中我们可以在
Monster
Data (Script)
组件看到
Levels
属性,设置
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
()
{
-
-
-
-
-
-
-
-
-
上一篇:主机审计
下一篇:高考英语作文常用的90个高级副词有中文版(诗)