如何在unity中制作塔防游戏——升级怪兽

如果你喜欢我们的教程,欢迎加入泰然网Unity交流群201505161

升级这些怪兽

在下图中,能看到在更高级别中怪兽看起来有多恐怖。

它太松软了!不过如果尝试去偷它的曲奇,怪兽就会变成杀手。

脚本作为执行怪兽登记系统的基础。它追踪在每一个等级怪兽拥有的力量,当然有怪兽的当前等级。
现在创建这个脚本。

在ProjectBrowser中选择Prefabs/Monster ,添加C# 脚本并命名为MonsterData。在MonoDevelop中打开脚本并在MonsterData 类上方添加以下代码。

[System.Serializable]
public class MonsterLevel{
    public int cost;
    public GameObject visualization;
}

这个创建了MonsterLevel。它将花费(金币,以后将会支持)和特定怪兽级别的视觉形象归为一组。

在顶部添加 [System.Serializable] 来使类的实例可以在检视面板中编辑。这样允许快速更改Level类中的所有值——及时游戏正在运行。这个对于平衡游戏非常有用。

定义怪兽等级

这种情况下,将预先定义的MonsterLevel 存储在一个List里。

为什么不仅仅用MonsterLevel[]?因为这里多次需要特定MonsterLevel 对象的索引。当然为这个写代码并不难,使用执行 Lists功能的IndexOf()。这里就不用重复工作了。

重组轮子通常是一个坏主意(来自Michael Vroegop)

在MonsterData.cs顶部添加下边的using声明:

using System.Collections.Generic;

这使你可以访问通用数据结构,因此可以在脚本中使用List 类型。

注:泛型是C#中非常强大的一部分。它们允许你在没有指定类型的情况下定义一个类型安全的数据结构。这个对于像列表和集合这种容器类型非常实用。想学更多关于泛型的知识,看一下Introduction to C# Generics。

现在在MonsterData 中添加以下变量来存储MonsterLevel的列表:

public List<MonsterLevel> levels;

如果使用泛型,请确保 levels List 只包含了MonsterLevel 对象。

保存文件并切换到unity来配置每个阶段。

在Project Browser中选择Prefabs/Monster 。在 Inspector中,可以在MonsterData (Script) 组件中看到一个Levels 字段。将它的size 设置为3.

接下来,将每个等级的cost 设置为以下值:

Element 0: 200
Element 1: 110
Element 2: 120

现在分配可视化区域值。

在项目浏览视口展开Prefabs/Monster 以便看到它的子集。将子集 Monster0拖拽到Element 0的visualization 区域。重复将Monster1 分配到 Element 1 并将Monster2 分配到 Element 2。看下边演示这个过程的GIF。

当选择 Prefabs/Monster时,预制件看起来应该是这样的:

监视面板中怪兽等级的定义。

定义当前等级

切换回MonoDevelop中的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(int i=0;i<levels.Count;i++){
        if(levelVisualization!=null){
            if(i==currentLevelIndex){
                levels[i].visualization.SetActive(true);[/i]
            }else{
                levels[i].visualization.SetActive(false);
            }
            }
        }
    }
}

有太多的C#?按顺序看一下:

  1. 为私有变量currentLevel定义一个属性。随着属性的定义就,就可以像其他变量一样呼叫了:像CurrentLevel (从类的内部)或monster.CurrentLevel(从类的外部)一样。在属性的getter或 setter方法里可以定义自定义行为,通过仅仅使用一个getter,setter或者两者同时使用,可以控制属性是只读,只写,还是读写。
  2. 在getter中,返回currentLevel值。
  3. 在setter中,为currentLevel分配新的值。接下来获取现有等级的索引。最后依据currentLevelIndex迭代所有的levels 并设置可视化是否为激活状态。这样写太棒了,因为这意味着无论什么时候设置了currentLevel,精灵都会自动更新。属性确实很方便使用。

Add the following implementation of OnEnable:

添加以下OnEnable实现。

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

根据位置设置CurrentLevel ,确保它只显示正确的精灵。

注:在OnEnable 中取代OnStart中初始化属性很重要,因为当预制件被实例化时才呼叫命令方法。创建预制件时(如果预制件被存为可用状态了)OnEnable 会被立刻呼叫,不过OnStart 只有当对象作为场景的一部分开始运行时才被呼叫。

在放置怪兽之前需要检查这个数据,所以要在OnEnable中初始化。

保存文件并切换带unity。运行项目并放置怪兽;现在他们显示正确的而且是最低级的精灵。


下次我们将继续升级这些怪兽。

转至:游戏蛮牛

标签: unity, unity制作塔防游戏

?>