U3D DotH教程3

U3D DotH教程3想必经过之前的两个教程 都已经能够成功的制作出一个具备 刷怪功能 寻路功能 建塔功能 交互界面 的塔防类游戏了 当然这样是远远不够的 今天的教程就要对之前的游戏做一个优化 随机怪物 真正的塔防游戏中 不会像现在这样 怪物一个接一个的出来 应该是成批次 一波一波的出现

大家好,我是讯享网,很高兴认识大家。

想必经过之前的两个教程,都已经能够成功的制作出一个具备

  1. 刷怪功能
  2. 寻路功能
  3. 建塔功能
  4. 交互界面

的塔防类游戏了。当然这样是远远不够的,今天的教程就要对之前的游戏做一个优化。


随机怪物

真正的塔防游戏中,不会像现在这样,怪物一个接一个的出来,应该是成批次,一波一波的出现,而且每一波都应该有不一样的怪物。

这里就涉及到两个问题

间隔成批复制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可见)

这样我们就得到了一个比较完整的计分系统。(=====好吧我又在骗人了.....)

完整的积分系统应该包括另一个东西,那就是击杀后得分。

小讯
上一篇 2025-04-05 17:51
下一篇 2025-04-01 17:15

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/26299.html