HTML5技术

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

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

切换到PlaceMonster.cs脚本,更新canPlaceMonster和canUpdateMonster方法如下,就是加上检查剩余金币是否足够的条件。 private bool canPlaceMonster(){int cost = monsterPrefab.GetComponentMonsterData().levels

切换到PlaceMonster.cs脚本,更新canPlaceMonster和canUpdateMonster方法如下,就是加上检查剩余金币是否足够的条件。

private bool canPlaceMonster() { int cost = monsterPrefab.GetComponent<MonsterData>().levels[0].cost; return monster == null && gameManager.Gold >= cost; //确保金币足够 } private bool canUpdateMonster() { if (monster != null) { MonsterData monsterData = monster.GetComponent<MonsterData>(); MonsterLevel nextLevel = monsterData.getNextLevel(); if (nextLevel != null) { return gameManager.Gold >= nextLevel.cost; //确保金币足够 } } return false; }

保存,并运行游戏,试试还能不能无限添加怪物。

img

敌人、波数和路标

是时候给敌人“铺路”了。敌人首先在第一个路标的地方出现,然后向下一个路标移动并重复这个动作,知道他们抵达你的饼干。
我们将通过下面的手段使敌人行军起来:

通过路标建立路线

在Hierarcy中右键,选择Create Empty创建一个新的空的游戏对象,命名为Road,并确保其位置坐标为(0, 0, 0)
接下来,右键点击Road并创建另一个空的游戏对象,命名为Waypoint0 并将其坐标设置为(-12, 2, 0),这将是敌人开始进攻的起始点。

创建另外5个路标:

  • Waypoint5: (7, -4.5, 0)
    下面的截图标示出了路标的位置以及最终的路线:

    img

  • 召唤敌人

    现在是时候去创建一些敌人来沿着上面的路线移动了。在Prefabs的文件夹中包含了一个Enemy的prefab。 它的位置坐标是(-20,0,0) ,所以新创建的敌人对象一开始在平面外面。

    跟Monster的prefab一样,Enemy的prefab同样包含了一个AudioSource,一个精灵图片(一会儿可以旋转其方向)。

    img

    使敌人沿着路线移动

    向Prefabs\Enemy新建一个名为MoveEnemy的C#脚本,使用代码编辑器打开,并添加下面的变量定义:

    [HideInInspector] public GameObject[] waypoints; private int currentWaypoint = 0; private float lastWaypointSwitchTime; public float speed = 1.0f;

    waypoints以数组的形式存储了所有的路标,它上面的HideInInspector特性确保了我们不会在inspector面板中不小心修改了它的值,但是我们仍然可以在其他脚本中访问。
    currentWaypoint记录了敌人当前所在的路标,lastWaypointSwitchTime记录了当敌人经过路标时用的时间,最后使用speed存储敌人的移动速度。

    增加下面这行代码到Start方法中:

    lastWaypointSwitchTime = Time.time;

    这里将lastWaypointSwitchTime初始化为当前时间。

    为了使敌人能沿路线移动,在Update方法中添加下面的代码:

    // 1 Vector3 startPosition = waypoints[currentWaypoint].transform.position; Vector3 endPosition = waypoints[currentWaypoint + 1].transform.position; // 2 float pathLength = Vector3.Distance(startPosition, endPosition); float totalTimeForPath = pathLength / speed; float currentTimeOnPath = Time.time - lastWaypointSwitchTime; gameObject.transform.position = Vector3.Lerp(startPosition, endPosition, currentTimeOnPath / totalTimeForPath); // 3 if (gameObject.transform.position.Equals(endPosition)) { if (currentWaypoint < waypoints.Length - 2) { // 3.a currentWaypoint++; lastWaypointSwitchTime = Time.time; // TODO: Rotate into move direction } else { // 3.b Destroy(gameObject); AudioSource audioSource = gameObject.GetComponent<AudioSource>(); AudioSource.PlayClipAtPoint(audioSource.clip, transform.position); // TODO: deduct health } }

    让我们一步一步来看:

  • 从路标数组中,取出当前路段的开始路标和结束路标。
  • 计算出通过整个路段所需要的时间(使用 距离除以速度 的公式),使用Vector3.Lerp插值计算出当前时刻应该在的位置。
  • 检查敌人是否已经抵达结束路标,如果是,则有两种可能的场景:
    A. 敌人尚未抵达最终的路标,所以增加currentWayPoint并更新lastWaypointSwitchTime,稍后我们要增加旋转敌人的代码使他们朝向前进的方向。
    B. 敌人抵达了最终的路标,就销毁敌人对象,并触发声音特效,稍后我们要增加减少玩家生命值的代码。
  • 保存文件,并返回到Unity。

    给敌人指明方向

    现在,敌人还不知道路标的次序。

    在Hierarchy中选中Road,然后添加一个新的C#脚本命名为SpawnEnemy,并在代码编辑器中打开,增加下面的变量:

    public GameObject[] waypoints;

    我们将使用waypoints来存放路标的引用。
    保存文件返回Unity, 在Hierarchy中选中Road,将WayPoints数组的大小改为6,拖拽Road的孩子节点到想用的Element位置,Waypoint0对应Element0以此类推。

    gif

    现在我们已经有了路线的路标数组,注意到敌人不会退缩。。。

    img

    检查一切顺利

    打开SpawnEnemy脚本,增加下面的变量:

    public GameObject testEnemyPrefab;

    这里使用了testEnemyPrefab保存对Enemyprefab的引用。
    使用下面的代码,当脚本开始时添加一个敌人:

    void Start () { Instantiate(testEnemyPrefab).GetComponent<MoveEnemy>().waypoints = waypoints; }

    上面的代码使用testEnemyPrefab实例化一个敌人对象,并将路标赋值给它。

     

    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

    网友点评
    n