想必经过之前的两个教程,都已经能够成功的制作出一个具备
- 刷怪功能
- 寻路功能
- 建塔功能
- 交互界面
的塔防类游戏了。当然这样是远远不够的,今天的教程就要对之前的游戏做一个优化。
随机怪物
真正的塔防游戏中,不会像现在这样,怪物一个接一个的出来,应该是成批次,一波一波的出现,而且每一波都应该有不一样的怪物。
这里就涉及到两个问题
间隔成批复制mMonster
随机生成怪物种类
第一点,我们可以回顾一下我们现在采用的策略。
当前的游戏中,我们使用了Invoke函数来重复调用函数。我们的脚本是这样写的。
InvokeRepeating("MonsterFactory", 1, 3f);
1s执行三次MonsterFactory(复制Monster对象)的函数。
那其实照理说来我们已经实现了一批一批的出现怪物,只不过每一批都只出现一次,而且时间间隔为1/3s很容易让人有一种流水线的错觉。
为了改变这一点我们可以在MonsterFactory做一点手脚。让他做一个循环。
<span style="font-size:14px;">void MonsterFactory() { for(int i =0;i<5;i++) MonsterTemp = Instantiate(Monster, startp.transform.position, Quaternion.identity) as GameObject; }</span>讯享网
这样的话,每一批出来的怪物就都是5个了!当然为了密集恐惧症的患者着想,我建议大家把Invoke的频率调低....
然后就有读者要扔板砖上来了!哪里有成批量的怪物啊!和以前不是一毛一样吗!
稍安勿躁,请仔细看Hierarchy栏,我们的怪物数量的的确确是变多了的,只不过他们一个不小心,重叠在了一起...

解决的办法我们之前已经在建立炮台的时候使用过了,给Instantiate的的二个参数添加一个X轴的偏移量new Vec3(i,0,0);
当然每一波都出来两个也是太过于无聊了。我们干脆用一个随机函数,让他每一次生成的数量都不一样。这里要使用到Rand随机变量,最后我们的代码如下
讯享网<span style="font-size:14px;">void MonsterFactory() { for (int i = 0; i < Random.Range(1,5); i++) { MonsterTemp = Instantiate(Monster, startp.transform.position+new Vector3(i,0,0), Quaternion.identity) as GameObject; } }</span>每一次都能出现1-5个怪物(是不是很豪华呢!!!)

计分系统
作为一个游戏,一定要有分数的对吧。
说到分数,大家第一时间想到的肯定是上一次Roll a Ball的GUI Text.传送门点我

当然有的人就是懒得戳链接,我们这里再重复一遍步骤
首先我们需要在Hierarchy列表中增加两个GUI text,作为显示分数用的文本和用来显示失败的文本。
塔防游戏中一项计分规则是:
当敌人没有被打死,走道了尽头时,玩家的生命值就会减一。我们先来做这个生命值减少的分数。
打开CreateTower脚本(因为在这里我们有了GUI所以就把计分系统也扔到这里来。
新建两个Public变量,用来挂载GUItxt组件。我们分别叫做scoreTxt和loseTxt。

由于scoreTxt是用来显示剩余生命值的,所以我们还需要一个float 型的score来实时更新。
代码如下
<span style="font-size:14px;"> public GUIText loseTxt; public GUIText scoreTxt; public float score; // Use this for initialization void Start () { score = 10; loseTxt.enabled = false; }</span>
将score初始化为0,并且让Lose默认不可见然后呢,score的减少应该在monster经过终点,被销毁的时候调用,找到那段代码。
这里有一个问题,我们的score是当前脚本的变量,如何在另一个脚本中调用呢。我们这里采取的方案如下
讯享网if (Vector3.Distance(wayPoint.GetChild(1).position, transform.position) < 1.0f) { Destroy(gameObject); GameObject.Find("Main Camera").GetComponent<CreateTower>().score--; }因为Unity中,脚本也被视为组件,所以你可以通过查询组件来获得脚本的public变量。
当然你也可以将变量声明为static型,就可以在别的脚本中调用了
score被更新之后,我们需要一个函数来实时把score传入scoreTxt中,这个函数写在CreateTower脚本中
void UpdateScore() { scoreTxt.text = "Left life:"+score.ToString(); if (score < 0) { scoreTxt.enabled = false; loseTxt.enabled = true; } }(在分数低于0之后让scoretxt不可见,让loseTxt可见)


这样我们就得到了一个比较完整的计分系统。(=====好吧我又在骗人了.....)
完整的积分系统应该包括另一个东西,那就是击杀后得分。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/26299.html