当前位置:   article > 正文

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

unity植物大战僵尸制作过程

最终效果

在这里插入图片描述

系列导航

制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版13(完结)

制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版12

制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版11

制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版10

制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版9

制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版8

制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版7

制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版6

制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版5

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

制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版3

制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版2

制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版1

前言

本节主要实现随机生成僵尸,小土豆以及一些优化

僵尸生成

新增GenerateZombies,这里先简单的,在各路随机生成僵尸

public class GenerateZombies : MonoBehaviour
{
    public float interval; //间隔
    public GameObject zombiePrefab; //僵尸预制体
    private void Start()
    {
        StartCoroutine(Generate());
    }

    private IEnumerator Generate()
    {
        int i = 0;
        while (true)
        {
            yield return new WaitForSeconds(interval); // 等待
            int index = Random.Range(0, 5);
            //获取子物体
            Transform pointTransform = transform.GetChild(index);
            GameObject go = Instantiate(zombiePrefab, pointTransform.position, Quaternion.identity);

            //修改排序
            go.GetComponent<SpriteRenderer>().sortingOrder = i;
            i++;
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

配置
在这里插入图片描述
效果
在这里插入图片描述

小土豆

配置动画
在这里插入图片描述

新增Plants代码,为所有植物的父类

//植物父类
public class Plants : MonoBehaviour, IInteractable
{
    
    public void OnDie()
    {
        Destroy(gameObject);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

新增WallNut代码,基础Plants

public class WallNut : Plants
{
    Animator animator;
    private void Start()
    {
        animator = GetComponent<Animator>();
    }

    private void Update()
    {
        //获取血量
        float currentHealth = GetComponent<Character>().currentHealth;
        float maxHealth = GetComponent<Character>().maxHealth;
        
        animator.SetFloat("percentage", currentHealth / maxHealth);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

在这里插入图片描述

种子完成再启动植物

修改Plants,新增isOpen变量,控制植物是否运行

public bool isOpen;//控制植物是否运行
  • 1

修改对应的脚本,比如PraShooter,控制豌豆射手发射子弹,其他植物同理

IEnumerator Attack()
{
    if(!isOpen) yield return null;
    while (true)
    {
        Shoot(); // 执行射击操作
        yield return new WaitForSeconds(interval); // 等待interval秒
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

修改Card

//开始拖拽
public void OnBeginDrag(PointerEventData eventData)
{
    Debug.Log("开始拖拽");
    if (progressBar.GetComponent<Image>().fillAmount != 0 || GameManager.Instance.sunSum < useSun) return;
    thisObject = Instantiate(prefab, transform.position, Quaternion.identity);

    //关闭运行
    thisObject.GetComponent<Plants>().isOpen = false;
    //关闭碰撞
    thisObject.GetComponent<Collider2D>().enabled = false;
    //关闭动画
    thisObject.GetComponent<Animator>().enabled = false;
}

//拖拽结束
public void OnEndDrag(PointerEventData eventData)
{
    Debug.Log("拖拽结束");
    if (thisObject == null) return;
    Vector3 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
    Vector2 mousePosition2D = new Vector2(mousePosition.x, mousePosition.y);
    RaycastHit2D hit = Physics2D.Raycast(mousePosition2D, Vector2.zero, Mathf.Infinity, layerMask);//鼠标“点检测”射线
    if (hit.collider != null && hit.collider.transform.childCount == 0)
    {
        thisObject.transform.parent = hit.transform;
        thisObject.transform.localPosition = Vector2.one;
        
        //开始运行
        thisObject.GetComponent<Plants>().isOpen = true;
        //开启碰撞
        thisObject.GetComponent<Collider2D>().enabled = true;
        //开启动画
        thisObject.GetComponent<Animator>().enabled = true;

        thisObject = null;
        //重置进度
        progressBar.GetComponent<Image>().fillAmount = 1;

        //扣除阳光
        GameManager.Instance.SetSunSum(-useSun);
    }
    else
    {
        Destroy(thisObject);
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

效果
在这里插入图片描述

源码

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

结束

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,以便我第一时间收到反馈,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,出于兴趣爱好,最近开始自学unity,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!php是工作,unity是生活!如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/770430
推荐阅读
相关标签
  

闽ICP备14008679号