HTML5技术

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

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

下面给monsterPrefab赋值,首先在Prefabs文件夹中选中OpenSpot,在Inspector面板中,点击PlaceMonster (Script)组件的Monster Prefab属性右边的小圆圈按钮,然后在弹出来的对话框中选择Monster。 现在开始游戏,在

下面给monsterPrefab赋值,首先在Prefabs文件夹中选中OpenSpot,在Inspector面板中,点击PlaceMonster (Script)组件的Monster Prefab属性右边的小圆圈按钮,然后在弹出来的对话框中选择Monster。

gif

现在开始游戏,在 X 标记上点击来创建一些怪物~

img

升级我们的怪物

在下面的图片中,我们看到怪物在不同的等级有不同的外观

img

我们需要一个脚本来作为怪物升级系统实现的基础,来跟踪管理怪物在各个级别的能力大小,当然还有怪物所处的当前等级。

现在来添加这个脚本 。

在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()方法,没有必要重新发明轮子了这次 :]

img

在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

img

接下来,设置每个等级的花费如下:

接下来,给visualization赋值。

在project browers中展开Prefabs/Monster来查看其子节点。拖拽子节点Monster0到visualization属性的Element 0。
重复上面的动作Monster1对Element 1,Monster2对Element 2,参考下面动图中的演示:

gif

现在,当你选中了Prefabs/Monster,它应该看下像下面这样子:

img

定义当前的等级

切换回MonsterData.cs中,向MonsterData类中添加另外一个变量:

private MonsterLevel currentLevel;

在私有变量currentLevel中,我们存放怪物当前的等级信息。
现在设置currentLevel同时将它暴露给其他脚本使用,添加下面的代码到MonsterData中:

//1 public MonsterLevel CurrentLevel { //2 get { return currentLevel; } //3 set { currentLevel = value; int currentLevelIndex = levels.IndexOf(currentLevel); GameObject levelVisualization = levels[currentLevelIndex].visualization; for(var i = 0; i< levels.Count; i++) { if(levelVisualization != null) { if(i == currentLevelIndex) { levels[i].visualization.SetActive(true); } else { levels[i].visualization.SetActive(false); } } } } }

看起来有很多C#代码,我们慢慢来看:

添加下面的OnEnable的一个实现:

void OnEnable() { CurrentLevel = levels[0]; }

这里设置了CurrentLevel的默认值,确保它只显示正确的那个精灵。

注意

在OnEnable中而不是OnStart中初始化属性的值,是因为当prefabs被实例化时方法的调用次序问题。
OnEnable会在创建prefab时立即被调用,而OnStart会等到对象作为场景的一部反的时候才会被调用。
这里我们需要在放置一个怪兽之前就要初始化一下,所以在OnEnable中初始化。

注意OnEnable中的大小写,如果大小写不对,方法不会被调用!

保存文件返回到Unity中,运行项目并且放置一些怪兽,现在他们显示正确的,也就是最低等级的精灵,如下图:

img

升级小怪兽

返回到代码编辑器,增加下面的方法到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。

我们可以使用该方法判断是否可以升级到下一个等级。

 

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

网友点评
s