添加下面的方法增加怪兽的等级:
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,运行游戏,试试放置和升级怪物~
目前而言,可以立即的建造和升级任意数目的怪兽,但这样一来,就木有挑战了。
我们接下来就处理金币的问题,为例维护金币的信息,你不得不要在不同的游戏对象之间共享数据信息。
下面的图片显示了所有需要金币信息的游戏对象:
我们将使用一个其他对象都能访问的共享对象来存储这类数据。
在Hierarchy面板中,右键选择Create Empty,并命名为GameManager。
添加一个C#脚本组件GameManagerBehavior到刚刚创建的GameManager上,然后打开并编辑这个脚本。
因为我们需要使用一个label显示玩家所拥有的金币数,所以在文件的顶部增加下面的引用:
这将允许我们使用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
运行游戏,可以看到金币的显示如下:
打开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,升级一些怪物并注意观察金币数目的变化。现在我们能够减少金币数了,但是。。。玩家可以一直放置怪物(只要有空位),金币数甚至可以变成负数。
这显然是不能被允许的,只有当玩家有足够的金币时,才能放置或者升级我们的怪物。