HTML5技术

使用unity创建塔防游戏(原译)(part1) - le0zh(3)

字号+ 作者:H5之家 来源:博客园 2016-02-24 12:00 我要评论( )

添加下面的方法增加怪兽的等级: public void increaseLevel(){int currentLevelIndex = levels.IndexOf(currentLevel);if (currentLevelIndex levels.Count - 1){CurrentLevel = levels[currentLevelIndex+1];}}

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

public void increaseLevel() { int currentLevelIndex = levels.IndexOf(currentLevel); if (currentLevelIndex < levels.Count - 1) { CurrentLevel = levels[currentLevelIndex+1]; } }

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

测试是否可以升级

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

private bool canUpdateMonster() { if (monster != null) { MonsterData monsterData = monster.GetComponent<MonsterData>(); MonsterLevel nextLevel = monsterData.getNextLevel(); if (nextLevel != null) { return true; } } return false; }

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

使可以通过金币升级

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

void OnMouseUp() { if (canPlaceMonster()) { //...这里跟原来的代码一样,这里省略了 }else if (canUpdateMonster()) { monster.GetComponent<MonsterData>().increaseLevel(); AudioSource audioSource = gameObject.GetComponent<AudioSource>(); audioSource.PlayOneShot(audioSource.clip); } }

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

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

img

支付金币 - Game Manager

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

我们接下来就处理金币的问题,为例维护金币的信息,你不得不要在不同的游戏对象之间共享数据信息。
下面的图片显示了所有需要金币信息的游戏对象:

img

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

在Hierarchy面板中,右键选择Create Empty,并命名为GameManager。
添加一个C#脚本组件GameManagerBehavior到刚刚创建的GameManager上,然后打开并编辑这个脚本。
因为我们需要使用一个label显示玩家所拥有的金币数,所以在文件的顶部增加下面的引用:

using UnityEngine.UI;

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

public Text goldLabel;

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

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

private int gold; public int Gold { get { return gold; } set { 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右边的圆圈按钮,在Select Text对话框中,选中Scene标签页,并选中GoldLabel

img

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

检查玩家的“钱包"

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

private GameManagerBehavior gameManager;

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

void Start () { gameManager = GameObject.Find("GameManager").GetComponent<GameManagerBehavior>(); }

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

收钱!

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

//todo: Deduct gold gameManager.Gold -= monster.GetComponent<MonsterData>().CurrentLevel.cost;

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

保存文件并返回unity,升级一些怪物并注意观察金币数目的变化。现在我们能够减少金币数了,但是。。。玩家可以一直放置怪物(只要有空位),金币数甚至可以变成负数。

img

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

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 【Vue 入门】使用 Vue2 开发一个展示项目列表的应用 - zhangjk

    【Vue 入门】使用 Vue2 开发一个展示项目列表的应用 - zhangjk

    2017-04-30 16:00

  • 对于Bootstrap的介绍以及如何使用 - novai-L

    对于Bootstrap的介绍以及如何使用 - novai-L

    2017-04-29 09:00

  • 在Delphi下使用迅雷APlayer组件进行免注册开发 - Delphi力量

    在Delphi下使用迅雷APlayer组件进行免注册开发 - Delphi力量

    2017-04-28 15:00

  • 探索 vuex 2.0 以及使用 vuejs 2.0 + vuex 2.0 构建记事本应用 - nzbin

    探索 vuex 2.0 以及使用 vuejs 2.0 + vuex 2.0 构建记事本应用 - nzb

    2017-04-25 09:02

网友点评
(