塔防游戏说明Word文档下载推荐.docx

上传人:b****6 文档编号:20893706 上传时间:2023-01-26 格式:DOCX 页数:27 大小:6.67MB
下载 相关 举报
塔防游戏说明Word文档下载推荐.docx_第1页
第1页 / 共27页
塔防游戏说明Word文档下载推荐.docx_第2页
第2页 / 共27页
塔防游戏说明Word文档下载推荐.docx_第3页
第3页 / 共27页
塔防游戏说明Word文档下载推荐.docx_第4页
第4页 / 共27页
塔防游戏说明Word文档下载推荐.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

塔防游戏说明Word文档下载推荐.docx

《塔防游戏说明Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《塔防游戏说明Word文档下载推荐.docx(27页珍藏版)》请在冰豆网上搜索。

塔防游戏说明Word文档下载推荐.docx

小怪兽只能放在标记有X的地方。

从ProjectBrower中拖动Images\Objects\Openspot到场景中,目前来说放到哪个位置没有关系。

在Hierarchy中选中Openspot,在Inspector面板点击 

AddComponent并且选择 

Physics2D\BoxCollider2D。

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

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

使用相同的步骤,添加一个Audio\AudioSource组件到 

Openspot上。

并且设置AudioSource’sAudioClip 

为 

tower_place(可以在Audio文件夹中找到),记住不能勾选PlayOnAwake。

你需要再创建11个放置点,每个都得重复上面的步骤,不过不用担心,Unity有一个很好的解决办法:

Prefab!

将OpenSpot从Hierarchy拖动到ProjectBrowser里面的Prefabs文件夹,它的名字在Hierarchy将会变成蓝色,用来标示它是和一个prefab相关联的。

像下面这样:

现在,你拥有了一个prefab,你就可以创建任意多的拷贝。

简单的将Openspot从Prefabs文件夹中拖拽到场景中,再重复11次,一共在场景中创建12个放置点。

下面使用Inspector面板来分别设置这个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)

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

放置小怪兽(防御塔)

为了使放置的工作简单点儿,工程的Prefab文件下中包含了一个Monster的prefab。

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

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

Monster的prefab同时包含了一个AudioSource的组件,当怪兽发射激光的时候会触发播放声音。

现在你将创建一个脚本来在Openspot上放置一个小怪兽。

在ProjectBrowser中选择Openspot,在Inspector面板中,点击 

AddComponent然后选择NewScript并重命名为PlaceMonster,选择C#作为脚本语言并以此点击Create和Add。

因为你是向prefab添加的脚本,所以场景中所有的Openspot都将会被附件该脚本。

双击刚才创建的脚本,在编辑器中打开。

然后添加下面的这两个变量

publicGameObjectmonsterPrefab;

privateGameObjectmonster;

你将使用monsterPrefab中的对象实例化一个拷贝来创建一个小怪兽,然后保存在monster变量中,方便之后的操作。

一个位置一个怪兽

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

privateboolcanPlaceMonster()

{

returnmonster==null;

}

在canPlaceMonster方法中,我们检查monster变量是否为null,如果是的,则表示当前没有放置小怪兽,所以是允许放置一个的。

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

//1

voidOnMouseUp()

//2

if(canPlaceMonster())

{

//3

monster=(GameObject)Instantiate(monsterPrefab,transform.position,Quaternion.identity);

//4

AudioSourceaudioSource=gameObject.GetComponent<

AudioSource>

();

audioSource.PlayOneShot(audioSource.clip);

//todo:

Deductgold

}

上面的代码在玩家点击或者Tap的时候放置一个怪兽,那么如何工作的呢?

1.当玩家点击一个游戏对象的碰撞器的时候,Unity会自动的调用OnMouseUp方法

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

2.使用 

Instantiate方法创建一个怪兽对象,这个方法会根据指定的prefab和指定的位置和旋转角度创建一个对象。

在本例中,我们拷贝了monsterPrefab 

,并指定了当前游戏对象的位置,以及没有旋转,最后将结果转换为GameObject类型存储在monster变量中。

3.最后,调用PlayOneShot方法播放附加在AudioSource组件上的声音特效。

现在我们的PlaceMonster脚本已经可以放置新的怪兽了,但还需要指定prefab这个步骤。

使用正确的Prefab

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

下面给monsterPrefab赋值,首先在Prefabs文件夹中选中OpenSpot,在Inspector面板中,点击PlaceMonster(Script)组件的MonsterPrefab属性右边的小圆圈按钮,然后在弹出来的对话框中选择Monster。

现在开始游戏,在X标记上点击来创建一些怪物~

升级我们的怪物

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

我们需要一个脚本来作为怪物升级系统实现的基础,来跟踪管理怪物在各个级别的能力大小,当然还有怪物所处的当前等级。

现在来添加这个脚本。

在ProjectBrowser中选中 

Prefabs/Monster,添加一个新的C#脚本命名为MonsterData,在代码编辑器中打开该脚本并添加下面的代码在MonsterData 

类的上面:

[System.Serializable]

publicclassMonsterLevel

publicintcost;

publicGameObjectvisualization;

这里定义了一个MonsterLevel类型,包含了费用(金币)以及对于某个特定等级的视觉效果。

我们添加了[System.Serializable]这个特性来使这个类的对象可以在inspector面板中编辑。

这可以使我们方便快速的改变MonsterLevel中的值,甚至在游戏运行过程中。

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

定义怪物的等级

我们将预先定义的MonsterLevel存储在List<

T>

中。

为什么不简单的使用数组MonsterLevel[]呢,首先我们会经常用到某个特定MonsterLevel对象的下标,当然如果使用数组编写一点代码来做这件事也不是特别困难。

我们可以直接使用List对象的IndexOf()方法,没有必要重新发明轮子了这次:

]

在MonsterData.cs文件的顶部,添加下面的引用:

usingSystem.Collections.Generic;

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

接下来添加下面的变量到MonsterData类中,用来存储MonsterLevel的列表:

publicList<

MonsterLevel>

levels;

使用泛型,可以保证levels只能存放MonsterLevel类型的对象。

在代码编辑器中保存文件,并返回到Unity中配置每个阶段.

在ProjectBrowser中选中Prefabs/Monster,然后在Inspector面板中我们可以在MonsterData(Script)组件看到Levels属性,设置size为3

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

∙Element0:

200

∙Element1:

110

∙Element2:

120

接下来,给visualization赋值。

在projectbrowers中展开Prefabs/Monster来查看其子节点。

拖拽子节点Monster0到visualization属性的Element0。

重复上面的动作Monster1对Element1,Monster2对Element2,参考下面动图中的演示:

现在,当你选中了Prefabs/Monster,它应该看下像下面这样子:

定义当前的等级

切换回MonsterData.cs中,向MonsterData类中添加另外一个变量:

privateMonsterLevelcurrentLevel;

在私有变量currentLevel中,我们存放怪物当前的等级信息。

现在设置currentLevel同时将它暴露给其他脚本使用,添加下面的代码到MonsterData中:

publicMonsterLevelCurrentLevel

get

returncurrentLevel;

set

currentLevel=value;

intcurrentLevelIndex=levels.IndexOf(currentLevel);

GameObjectlevelVisualization=levels[currentLevelIndex].visualization;

for(vari=0;

i<

levels.Count;

i++)

if(levelVisualization!

=null)

if(i==currentLevelIndex)

levels[i].visualization.SetActive(true);

else

levels[i].visualization.SetActive(false);

看起来有很多C#代码,我们慢慢来看:

1.为私有变量currentLevel定义一个属性。

当属性被定义之后,你就能像其他变量一样去调用,既可以CurrentLevel这样在类的内部调用,也可以使用monster.CurrentLevel这样在类的外部调用。

然后还能自定义属性的getter和setter方法,通过只提供一个getter,只有一个setter或者都有,来控制一个属性是只读的、只写的或者读写的。

2.在getter方法中,直接返回私有变量currentLevel的值

3.在setter方法中,给currentLevel赋值。

先拿到当前等级的下标,然后遍历levels数组依据currentLevelIndex的值设置外观的活动或者非活动状态,好处就在于不管什么时候谁设置了currentLevel,精灵会自动更新。

添加下面的OnEnable的一个实现:

voidOnEnable()

CurrentLevel=levels[0];

这里设置了CurrentLevel的默认值,确保它只显示正确的那个精灵。

注意

在OnEnable中而不是OnStart中初始化属性的值,是因为当prefabs被实例化时方法的调用次序问题。

OnEnable会在创建prefab时立即被调用,而OnStart会等到对象作为场景的一部反的时候才会被调用。

这里我们需要在放置一个怪兽之前就要初始化一下,所以在OnEnable中初始化。

注意OnEnable中的大小写,如果大小写不对,方法不会被调用!

保存文件返回到Unity中,运行项目并且放置一些怪兽,现在他们显示正确的,也就是最低等级的精灵,如下图:

升级小怪兽

返回到代码编辑器,增加下面的方法到MonsterData中:

publicMonsterLevelgetNextLevel()

intmaxLevelIndex=levels.Count-1;

if(currentLevelIndex<

maxLevelIndex)

returnlevels[currentLevelIndex+1];

returnnull;

在getNextLevel方法中,我们首先拿到当前等级的下标以及最高等级的下标,以此判断如果当前不是最高等级时,返回下个等级,否则返回null。

我们可以使用该方法判断是否可以升级到下一个等级。

添加下面的方法增加怪兽的等级:

publicvoidincreaseLevel()

levels.Count-1)

CurrentLevel=levels[currentLevelIndex+1];

这里我们获取当前等级的下标,然后确保它不会大于最高等级的下标,如果不大于,则将CurrentLevel设置为下一个等级。

测试是否可以升级

保存刚才的脚本文件,返回到PlaceMonster.cs文件,增加下面的方法:

privateboolcanUpdateMonster()

if(monster!

MonsterDatamonsterData=monster.GetComponent<

MonsterData>

MonsterLevelnextLevel=monsterData.getNextLevel();

if(nextLevel!

returntrue;

returnfalse;

首先,检查monster变量是否为null,如果为null则肯定不能升级了,如果不为null则获取其MonsterData组件,并检查更高的等级是否存在,如果getNextLevel方法返回的值不是null则说明更高的等级存在(返回true),否则不存在(返回false)。

使可以通过金币升级

为了能够升级,在PlaceMonster中的OnMouseUp中添加elseif分支:

//...这里跟原来的代码一样,这里省略了

}elseif(canUpdateMonster())

monster.GetComponent<

().increaseLevel();

首先我们通过canUpdateMonster检查能否升级,如果可以升级,则通过调用MonsterData组件的increaseLevel方法升级怪物,最后播放一次声音特效。

保存文件并返回到Unity,运行游戏,试试放置和升级怪物~

支付金币-GameManager

目前而言,可以立即的建造和升级任意数目的怪兽,但这样一来,就木有挑战了。

我们接下来就处理金币的问题,为例维护金币的信息,你不得不要在不同的游戏对象之间共享数据信息。

下面的图片显示了所有需要金币信息的游戏对象:

我们将使用一个其他对象都能访问的共享对象来存储这类数据。

在Hierarchy面板中,右键选择CreateEmpty,并命名为GameManager。

添加一个C#脚本组件GameManagerBehavior到刚刚创建的GameManager上,然后打开并编辑这个脚本。

因为我们需要使用一个label显示玩家所拥有的金币数,所以在文件的顶部增加下面的引用:

usingUnityEngine.UI;

这将允许我们使用UI相关的类型,比如Text用做显示用的label,接下来在类中添加下面的变量:

publicTextgoldLabel;

这个变量存储了对Text组件的引用,将用于显示玩家所拥有的所有金币数。

现在GameManager已经可以操作label了,但是我们如何保证变量中存储的金币数和label显示的数量同步呢,我们创建一个属性:

privateintgold;

publicintGold

get{returngold;

gold=value;

goldLabel.GetComponent<

Text>

().text="

GOLD:

"

+gold;

是不是看起来很熟悉,这个跟我们在Monster中定义的CurrentLevel比较相像,首先我们创建一个私有的变量gold用来存储当前所有的金币数,然后定义一个名为Gold的属性,并提供getter和setter方法。

在getter方法中简单的直接返回gold,setter方法则比较有趣了,除了设置gold的值,还设置了goldLabel的显示。

这样就保持了金币数和显示的同步。

在Start()中增加下面的初始化语句,默认给玩家100金币(当然你可以给更少的)

Gold=100;

给脚本中的Label对象赋值

保持脚本文件并返回到Unity中。

在Hierarcy中,选中GameManager,在Inspector面板,点击GoldLabel右边的圆圈按钮,在SelectText对话框中,选中Scene标签页,并选中GoldLabel

运行游戏,可以看到金币的显示如下:

检查玩家的“钱包"

打开PlaceMonster.cs文件,增加下面这行代码:

privateGameManagerBehaviorgameManager;

我们将通过变量gameManager来访问场景中GameManager的GameManagerBehavior组件,并在Start方法中初始化:

voidStart()

gameManager=GameObject.Find("

GameManager"

).GetComponent<

GameManagerBehavior>

我们使用GameObject.Find方法,找到名为GameManager的游戏对象,然后定位到其GameManagerBehavior组件并存到一个私有变量中,供稍后使用。

收钱!

我们还没有减少金币数,所以在OnMouseUp方法里面,将原来的TODO注释修改为下面的代码:

gameManager.Gold-=monster.GetComponent<

().CurrentLevel.cost;

注意是两个地方,在放置和升级的逻辑里各有一处。

保存文件并返回unity,升级一些怪物并注意观察金币数目的变化。

现在我们能够减少金币数了,但是。

玩家可以一直放置怪物(只要有空位),金币数甚至可以变成负数。

这显然是不能被允许的,只有当玩家有足够的金币时,才能放置或者升级我们的怪物。

切换到PlaceMonster.cs脚本,更新canPlaceMonster和canUpdateMonster方法如下,就是加上检查剩余金币是否足够的条件。

intcost=monsterPrefab.GetComponent<

().levels[0].cost;

returnmonster==null&

&

gameManager.Gold>

=cost;

//确保金币足够

returngameManager.Gold>

=nextLevel.cost;

保存,并运行游戏,试试还能不能无限添加怪物。

敌人、波数和路标

是时候给敌人“铺路”了。

敌人首先在第一个路标的地方出现,然后向下一个路标移动并重复这个动作,知道他们抵达你的饼干。

我们将通过下面的手段使敌人行军起来:

1.定义敌人移动的路线

2.使敌人沿着路线移动

3.旋转敌人,使他们看起来是向前方行进

通过路标建立路线

在Hierarcy中右键,选择CreateEmpty创建一个新的空的游戏对象,命名为Road,并确保其位置坐标为(0,0,0)

接下来,右键点击Road并创建另一个空的游戏对象,命名为Waypoint0并将其坐标设置为(-12,2,0

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1