制作更多的Defender:

之前我们创建了一个向日葵和一个仙人掌,今天我们多创建两个

首先是一个老头Gnome,我们让它的功能和仙人掌一样,所以我会尽量快点讲完,

需要给它三个脚本Defender,Shooter,Health

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Defender : MonoBehaviour
{[SerializeField] int starCost = 100;public int GetStarCost(){return starCost;}public void AddStars(int amount){FindObjectOfType<StarsDisplay>().AddStars(amount);}
}
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Shooter : MonoBehaviour
{[SerializeField] GameObject projectTile;[SerializeField] GameObject gun;AttackSpawner myLaneSpawner;Animator animator;private void Start(){animator = GetComponent<Animator>();SetLaneSpawner();}private void Update(){if(IsAttackerInLand()){animator.SetBool("isAttacking", true);}else{animator.SetBool("isAttacking", false);}}private void SetLaneSpawner(){AttackSpawner[] spawners = FindObjectsOfType<AttackSpawner>();//找到这行路的所有敌人foreach(var spawner in spawners){//判断是不是在我们这一行bool IsCloseEnough = (Mathf.Abs( spawner.transform.position.y - transform.position.y ) <= Mathf.Epsilon);if (IsCloseEnough){myLaneSpawner = spawner; //找到我这条路的生成敌人}}}private bool IsAttackerInLand(){//如果我这条路上的敌人数量小于等于0return falseif(myLaneSpawner.transform.childCount <= 0){return false;}else{return true;}}public void Fire(){Instantiate(projectTile, gun.transform.position, transform.rotation); //生成子弹}
}
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Health : MonoBehaviour
{[SerializeField] float health = 100f;[SerializeField] GameObject deathVFX;public void DealDamage(float damage){health -= damage;if(health <= 0){TriggerDeathVFX();Destroy(gameObject);}}//生成爆炸特效private void TriggerDeathVFX(){if (!deathVFX) return;GameObject deathVFXObject = Instantiate(deathVFX, transform.position, transform.rotation);Destroy(deathVFXObject, 1f); //1秒后销毁生成的爆炸特效}
}

然后给它碰撞框和动画并把参数都填上去后我们给它一个空对象Body创建组件Sprite Renderer。通过改变它的Sprite来制造动画。

斧头的Prefab如下

动画就让他旋转365°

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Projectile : MonoBehaviour
{[SerializeField] float speed = 1f;[SerializeField] float damage = 50f;void Update(){transform.Translate(Vector2.right * speed * Time.deltaTime);}private void OnTriggerEnter2D(Collider2D other){var health = other.GetComponent<Health>();var attacker = other.GetComponent<Attacker>();if(attacker && health){health.DealDamage(damage);Destroy(gameObject);}}
}

然后我们来创建一个墓碑GraveStone,相当于高坚果,它的血量非常厚可以挡住很久

除了前面的脚本还要给他一个独特的脚本,但只是给之后我们创建的敌人识别的

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class GraveStone : MonoBehaviour
{private void OnTriggerStay2D(Collider2D other){Attacker attacker = other.GetComponent<Attacker>();if (attacker){}}
}

给它做个动画就稍微改变一下它的Scale值

最后,别忘了把他们放到我们之前创建的Quad中

创建敌人:

在创建新的敌人之前,我们需要让敌人都实现能吃植物的动画,因此我们创建一个鳄鱼的吃植物动画Lizard Attack把对应的素材拖进ANimation

我们选择添加动画事件,当执行那一帧的时候植物掉血。

吃植物时候速度为0

这个是一口多少血

创建一个Lizard给它

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Lizard : MonoBehaviour
{private void OnTriggerEnter2D(Collider2D other){GameObject otherGameObject = other.gameObject;if (otherGameObject.GetComponent<Defender>()){GetComponent<Attacker>().Attack(otherGameObject);}}
}

Attacker脚本更新后如下:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Attacker : MonoBehaviour
{GameObject currentTarget;[Range(0, 5)]float currentSpeed = 1f;private void Awake(){FindObjectOfType<LevelController>().AttackerSpawn();}private void OnDestroy(){LevelController level = FindObjectOfType<LevelController>();if (level != null){level.AttackerKilled();}}void Update(){transform.Translate(Vector2.left * currentSpeed * Time.deltaTime);UpdateAnimationState();}private void UpdateAnimationState(){if (!currentTarget){GetComponent<Animator>().SetBool("isAttacking", false); }}public void SetMovementSpeed(float speed){currentSpeed = speed;}public void Attack(GameObject target){GetComponent<Animator>().SetBool("isAttacking", true); //播放吃植物动画currentTarget = target;//锁定植物}public void StrikeCurrentTarget(float damage){if (!currentTarget) return;Health health = currentTarget.GetComponent<Health>();if (health){health.DealDamage(damage);//扣植物的血}}}

在完成了鳄鱼后,我们要创建一个特别的狐狸敌人:

同样先给他设置好动画

 给它添加好脚本后添加参数再创建一个名字叫fox的脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Fox : MonoBehaviour
{private void OnTriggerEnter2D(Collider2D other){GameObject otherGameObject = other.gameObject;if (otherGameObject.GetComponent<GraveStone>()) //当遇到gravestone时他会跳过去{GetComponent<Animator>().SetTrigger("JumpTrigger");}else if (otherGameObject.GetComponent<Defender>()) //而其它的他会吃掉{GetComponent<Attacker>().Attack(otherGameObject);}}
}

同样我们也要为他创建动画事件


游戏效果:

可见跑的跑跳的跳,鳄鱼直接开吃,最下排的生成敌人给老头两斧头扔死了

[Unity2D入门教程]简单制作仿植物大战僵尸游戏之⑤制作更多的敌人Attacker以及防御者Defender相关推荐

  1. [Unity2D入门教程]简单制作仿植物大战僵尸游戏之①搭建场景

    布置场景: 众所周知,植物大战僵尸非常好玩,所以我们来制作一款类似的,名字就叫Glitch Garden. 布置场景需要用到很多素材,这里我们在GitHub中找到一位老师的素材并把需要的导入到proj ...

  2. [Unity2D入门教程]简单制作仿植物大战僵尸游戏之②搭建游戏场景+制作动画

    布置场景: 我们首先要创建一个新场景就叫level1, 我们在project面板中找到这张图 我们在新建的Canvas上创建一张background把这张拖进去点击Set Native Size 然后 ...

  3. 游戏建模入门教程:绝地求生—PUBG的游戏模型制作流程

    <绝地求生>好玩吗?说实话,好玩也很刺激,尤其是进房子的时候被别人一枪偷了屁股的时候.自游戏发布以来,已经有一个年头了.今天在这里就给大家看看游戏里面的模型是什么样的!!! 如果你也想未来 ...

  4. 【Unity3D开发小游戏】《植物大战僵尸游戏》Unity开发教程

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 文章目录 一.前言 二.源码 三.正文 版本 1.主摄像机设置 2.创造草地 ...

  5. Unity2D 入门教程

    Unity2D 入门教程 常用操作 通用操作 游戏状态进行保存 使用 TileMap 绘制地图 实现碰撞体效果 移动 Bug 的修复 实现人物控制 动画系统 镜头控制 脚本控制 Cinemachine ...

  6. 如何用python简单做一个植物大战僵尸 源码

    简单实现的植物大战僵尸我自己网上扣了王校长的图做了个热狗射手hhhhhhhh最后面给大家分享一下我扣的热狗png图片求点赞!!!""" v1.81.完善僵尸类2.加载僵尸 ...

  7. python植物大战僵尸代码例_用Python实现植物大战僵尸游戏,很酷

    以前很火的植物大战僵尸游戏, 本想在网上找个python版本游戏学习下,无奈没有发现比较完整的,那就自己来写一个把.图片资源是从github上下载的,因为图片资源有限,只能实现几种植物和僵尸. 功能实 ...

  8. 【游戏开发实战】使用Unity 2019制作仿微信小游戏飞机大战(七):主角飞机碰撞与爆炸

    文章目录 零.教程目录 一.前言 二.本篇目标 三.飞机机碰撞组件:BoxCollider2D.Rigidbody2D 四.添加Tag:Enemy 五.主角飞机碰撞处理:OnTriggerEnter2 ...

  9. python版植物大战僵尸源码_基于python的植物大战僵尸游戏设计与实现.docx

    湖南理工学院毕业设计(论文) PAGE PAGE 1 学 号 毕业设计(论文) 题目:基于python的植物大战僵尸游戏设计与实现 作 者 届 别 届 院 别 信息与通信工程学院 专 业 信息工程 指 ...

最新文章

  1. iOS 设置UILabel 的行间距
  2. 网线的制作方法和千兆网线的施工注意事项
  3. 【NodeJS 学习笔记04】新闻发布系统
  4. 快速切換手機版網頁語法
  5. 51单片机 外部时钟_基于51单片机的LCD12864显示模拟时钟
  6. python 并行读取文件_python对文件进行并行计算初探(二)
  7. CMU 15-213 Introduction to Computer Systems学习笔记(23) Thread-Level Parallelism
  8. mysql数据库原理及应用教案_《数据库原理及应用》全套教案.doc
  9. PC端浏览器模拟微信浏览器环境
  10. Windows商店安装问题已解决 Xbox应用将改善游戏安装
  11. 基因测序技术发展历史及一、二、三代测序技术原理和应用
  12. Spark的调度流程(任务调度+资源调度)
  13. MySQL调优篇:单机数据库如何在高并发场景下健步如飞?
  14. VOLTE与VOWIFI对比
  15. 【数据结构】二叉树 (Binary Tree)
  16. 【开发】后端框架——SpringBoot
  17. Python:Excel自动录入、Excel表格快速合并(附有源代码)
  18. coursera无法播放视频
  19. Compareable接口
  20. js for循环 遍历数组 遍历对象属性

热门文章

  1. 基于Linux(Ubuntu)的触摸屏幕校准
  2. 小甲鱼数据结构——第二天
  3. 解决:Error: Continuous value supplied to discrete scale
  4. CVTE2016校园大使火热招募!
  5. Android订票系统订票功能实现(特效点击按钮实现票数自动加减1)
  6. 【100个 Unity实用技能】☀️ | 求反射向量的方法,让小球按照物理反射的角度反弹(出射角=入射角)
  7. 微信小程序 | 如何使用wx.request发送文件?
  8. Vue源码之mustache模板引擎(一)
  9. 启动磁盘不能被分区或恢复成单个分区-解决了
  10. 湖北沙洋中学2021年6月高考成绩查询,荆门2021年中考时间定于6月19日至22日!全市设7个考区、18个考点…...