下面给monsterPrefab赋值,首先在Prefabs文件夹中选中OpenSpot,在Inspector面板中,点击PlaceMonster (Script)组件的Monster Prefab属性右边的小圆圈按钮,然后在弹出来的对话框中选择Monster。
现在开始游戏,在 X 标记上点击来创建一些怪物~
在下面的图片中,我们看到怪物在不同的等级有不同的外观
我们需要一个脚本来作为怪物升级系统实现的基础,来跟踪管理怪物在各个级别的能力大小,当然还有怪物所处的当前等级。
现在来添加这个脚本 。
在Project Browser中选中 Prefabs/Monster,添加一个新的C#脚本命名为MonsterData,在代码编辑器中打开该脚本并添加下面的代码在MonsterData 类的上面:
[System.Serializable] public class MonsterLevel { public int cost; public GameObject visualization; }这里定义了一个MonsterLevel类型,包含了费用(金币)以及对于某个特定等级的视觉效果。
我们添加了[System.Serializable]这个特性来使这个类的对象可以在inspector面板中编辑。这可以使我们方便快速的改变MonsterLevel中的值,甚至在游戏运行过程中。这在调节游戏平衡性的时候特别的有用。
定义怪物的等级我们将预先定义的MonsterLevel存储在List<T>中。
为什么不简单的使用数组MonsterLevel []呢,首先我们会经常用到某个特定MonsterLevel对象的下标,当然如果使用数组编写一点代码来做这件事也不是特别困难。我们可以直接使用List对象的IndexOf()方法,没有必要重新发明轮子了这次 :]
在MonsterData.cs文件的顶部,添加下面的引用:
using System.Collections.Generic;这将允许我们使用泛型的数据结构类型,所以可以在脚本代码中使用List<T>。
接下来添加下面的变量到MonsterData类中,用来存储MonsterLevel的列表:
public List<MonsterLevel> levels;使用泛型,可以保证levels只能存放MonsterLevel类型的对象 。
在代码编辑器中保存文件,并返回到Unity中配置每个阶段.
在Project Browser中选中Prefabs/Monster,然后在Inspector面板中我们可以在MonsterData (Script)组件看到Levels属性,设置size为3
接下来,设置每个等级的花费如下:
接下来,给visualization赋值。
在project browers中展开Prefabs/Monster来查看其子节点。拖拽子节点Monster0到visualization属性的Element 0。
重复上面的动作Monster1对Element 1,Monster2对Element 2,参考下面动图中的演示:
现在,当你选中了Prefabs/Monster,它应该看下像下面这样子:
切换回MonsterData.cs中,向MonsterData类中添加另外一个变量:
private MonsterLevel currentLevel;在私有变量currentLevel中,我们存放怪物当前的等级信息。
现在设置currentLevel同时将它暴露给其他脚本使用,添加下面的代码到MonsterData中:
看起来有很多C#代码,我们慢慢来看:
添加下面的OnEnable的一个实现:
void OnEnable() { CurrentLevel = levels[0]; }这里设置了CurrentLevel的默认值,确保它只显示正确的那个精灵。
注意在OnEnable中而不是OnStart中初始化属性的值,是因为当prefabs被实例化时方法的调用次序问题。
OnEnable会在创建prefab时立即被调用,而OnStart会等到对象作为场景的一部反的时候才会被调用。
这里我们需要在放置一个怪兽之前就要初始化一下,所以在OnEnable中初始化。
注意OnEnable中的大小写,如果大小写不对,方法不会被调用!
保存文件返回到Unity中,运行项目并且放置一些怪兽,现在他们显示正确的,也就是最低等级的精灵,如下图:
返回到代码编辑器,增加下面的方法到MonsterData中:
public MonsterLevel getNextLevel() { int currentLevelIndex = levels.IndexOf(currentLevel); int maxLevelIndex = levels.Count - 1; if (currentLevelIndex < maxLevelIndex) { return levels[currentLevelIndex+1]; } else { return null; } }在getNextLevel方法中,我们首先拿到当前等级的下标以及最高等级的下标,以此判断如果当前不是最高等级时,返回下个等级,否则返回null。
我们可以使用该方法判断是否可以升级到下一个等级。