【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版4(附带项目源码)

简介: 【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版4(附带项目源码)

前言

本节主要实现配置僵尸动画,移动,断头,攻击,死亡功能。

僵尸

配置僵尸动画

普通动画

无头动画,新增覆盖图层

需要注意的是,僵尸死亡记得去掉过度自动的勾选,不然死亡动画会一直重复播放

移动

新增Zombie

public class Zombie : MonoBehaviour
{
    public Vector3 direction; //移动方向
    public float speed;//速度

    void Update()
    {
        transform.position += direction * speed * Time.deltaTime;
    }
}

效果

断头

新增断头动画,配置预制体

修改Zombie,比如我们希望僵尸50血开始断头

private Animator animator;
private Character character;
public GameObject lostHead;//断头预制体
private Transform head;//断头位置
private bool isLostHead;//是否已经断头

private void Start()
{
    animator = GetComponent<Animator>();
    character = GetComponent<Character>();
    head = transform.Find("Head");
    currentSpeed = speed;
}

void Update()
{
  //移动
    transform.position += direction * currentSpeed * Time.deltaTime;

    //断头
    if (character.currentHealth <= 50 && isLostHead == false)
    {
        isLostHead = true;
        Instantiate(lostHead, head.position, Quaternion.identity);
        animator.SetBool("headless", true);
    }
}

配置

并在断头预制体新增脚本LostHead,一段时间后销毁

public class LostHead : MonoBehaviour
{
    public float existenceTime = 3f;//存在时间

    private void Start()
    {
        Destroy(gameObject, existenceTime);
    }
}

效果

攻击

修改Zombie

//进入触发器 
private void OnTriggerEnter2D(Collider2D other)
{
    if (!other.CompareTag("Plant")) return;

    animator.SetBool("attack", true);
    currentSpeed = 0;
}

//离开触发器
private void OnTriggerExit2D(Collider2D other)
{
    if (!other.CompareTag("Plant")) return;

    animator.SetBool("attack", false);
    currentSpeed = speed;
}

记得修改僵尸刚体为永不休眠,不然可能

效果

死亡

植物和僵尸,甚至子弹其实都存在死亡,为了统一的进行管理,我们可以引用接口的定义

新增interface接口,定义OnDie死亡方法

public interface IInteractable
{
    // 死亡
    public void OnDie();
}

修改Character,调用对应接口的死亡方法

public void TakeDamage(Attack attacker)
{
    if (invulnerable) return;

    if (currentHealth - attacker.damage > 0)// 如果扣除伤害后生命值大于0
    {
        currentHealth -= attacker.damage;// 扣除伤害值
        StartCoroutine(InvulnerableTimer()); // 启动无敌状态计时器
    }
    else
    {
        currentHealth = 0;
        GetComponent<IInteractable>().OnDie();
    }

}

修改Zombie,关联IInteractable接口,定义僵尸的死亡方法

public class Zombie : MonoBehaviour, IInteractable
{
  //。。。

  public void OnDie()
    {
        currentSpeed = 0;
        animator.SetBool("die", true);
        GetComponent<Collider2D>().enabled = false;
        Destroy(gameObject, 2f);
    }
}

同理,定义植物和子弹的死亡方法。记得同样关联IInteractable接口

public void OnDie()
{
    Destroy(gameObject);
}

僵尸死亡效果

植物死亡效果

源码

源码不出意外的话我会放在最后一节

目录
相关文章
|
9天前
|
存储 JSON 关系型数据库
【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解
【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解
18 2
|
9天前
|
图形学
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(上)
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)
19 2
|
9天前
|
存储 JSON 图形学
【unity实战】制作unity数据保存和加载系统——小型游戏存储的最优解
【unity实战】制作unity数据保存和加载系统——小型游戏存储的最优解
10 0
|
9天前
|
图形学
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(下)
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(下)
18 0
|
9天前
|
图形学
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版3(附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版3(附带项目源码)
21 2
|
9天前
|
图形学
【制作100个unity游戏之28】花半天时间用unity复刻童年4399经典小游戏《黄金矿工》(附带项目源码)
【制作100个unity游戏之28】花半天时间用unity复刻童年4399经典小游戏《黄金矿工》(附带项目源码)
22 0
|
9天前
|
图形学
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版2(附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版2(附带项目源码)
11 1
|
9天前
|
存储 JSON 关系型数据库
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版13(完结,附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版13(完结,附带项目源码)
15 0
|
9天前
|
图形学
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版12(附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版12(附带项目源码)
14 0
|
9天前
|
存储 图形学
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版11(附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版11(附带项目源码)
11 0