【U3D小游戏】愤怒的小鸟(四)部分游戏逻辑

举报
布小禅 发表于 2022/10/07 20:52:34 2022/10/07
【摘要】 自己做一下小时候玩的风靡一时的愤怒的小鸟这个游戏,相信有很多人都在某一段时间沉迷过这个游戏吧~~

前言

自己做一下小时候玩的风靡一时的愤怒的小鸟这个游戏,相信有很多人都在某一段时间沉迷过这个游戏吧~~

五、游戏逻辑判定

游戏胜利的判定,多只小鸟轮番成为游戏主角,毕竟我们玩的愤怒的小鸟是有多个小鸟的

1. 增加小猪和小鸟的数量

现在我们的场景中只有一个小鸟和一个猪,所以我们先使用copy的方式来增加小鸟和猪的数量,毕竟小鸟和小猪的脚本配置已经差不多了。

直接选中小鸟和猪,使用快捷键Ctrl + D进行复制个数看你自己

在这里插入图片描述

2. 创建管理类

  1. 添加一个空物体,并且为空物体添加一个脚本,一般都命名为:GameManager

  2. 创建空物体直接在Hierarchy中右键创建Create Empty即可,同样的,我们命名为GameManager

  3. 然后点开GameManagerInspector面板,创建GameManager脚本。

  4. 编写GameManager类的代码

    /**
     * ==========================================
     * FileName:#GameManager#
     * Author:#Smly#
     * CreatTime:#2022/10/7#
     * NowPath:#path#
     * ==========================================
     */
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class GameManager : MonoBehaviour
    {
        public List<ColliderBird> birds;
        public List<Pig> pigs;
        //设置单例模式,小鸟死亡后将小鸟从列表中删除,然后再次调用BirdSet函数,将删除后的列表中的第一个小鸟设置启用
        public static GameManager _instance;
        /// <summary>
        /// 遍历小鸟列表,把除了第一个的小鸟的弹簧和脚本组件禁用
        /// </summary>
        public void BirdSet()
        {
            for (int i = 0; i < birds.Count; i++)
            {
                if (i==0)
                {
                    // 第一个小鸟,弹簧和脚本组件启用
                    birds[i].enabled = true;
                    birds[i].sp2.enabled = true;//这里需要将我们之前设置的弹簧组件设置成public,否则无法访问
                }
                else
                {
                    //后面的小鸟禁用
                    birds[i].enabled = false;
                    birds[i].sp2.enabled = false;
                }
            }
        }
    }
    
  5. 将游戏物体添加到我们创建的列表里,直接拖拽即可,小鸟注意顺序,小猪不需要

    在这里插入图片描述

3. 设置小鸟和小猪死亡

修改部分如下:

小鸟脚本部分

public class ColliderBird : MonoBehaviour
{
    //修改部分
    [HideInInspector]
    public SpringJoint2D sp2;//弹簧组件
    void Power()
    {
        
        sp2.enabled = false;//将束缚小鸟的弹簧禁用掉
        Invoke("NextBird", 5);//五秒后销毁小鸟
    }
    //新增部分
    void NextBird()
    {
        GameManager._instance.birds.Remove(this);//将小鸟从列表中移除
        Destroy(gameObject);//销毁小鸟
    }
}

小猪脚本部分:

public class Pig : MonoBehaviour
{
    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.relativeVelocity.magnitude > maxSpeed)
        {
            //销毁小猪
            GameManager._instance.pigs.Remove(this);//将死亡的小猪从列表中移除
            Destroy(gameObject);
        }
        else if (collision.relativeVelocity.magnitude > minSpeed && collision.relativeVelocity.magnitude < maxSpeed)
        {
            //小猪受伤,图片更换
            render.sprite = hurtPig;
        }
    }
}

4. 输赢的判断

根据场景中小鸟和猪的数量进行判定

小猪数量>小鸟数量——>输了

小鸟数量>0且小猪数量=0——>赢了

小鸟数量和小猪数量都>0——>下一个小鸟登场

public class GameManager : MonoBehaviour
{
    public void NextBird()
    {
        if (pigs.Count > 0)
        {
            if (birds.Count < 0)
            {
                //输了
                //游戏结束
            }
            else
            {
                BirdSet();
            }
        }
        else
        {
            //赢了
        }
    }
}

同时我们需要对GameManager类进行初始化,所以在小鸟类中

public class ColliderBird : MonoBehaviour
{
    private void Start()
    {
        right = GameObject.Find("Rifht_dangong").GetComponent<Transform>(); 
        rb2 = GetComponent<Rigidbody2D>();
        sp2 = GetComponent<SpringJoint2D>();
        GameManager._instance.BirdSet();
    }
}

5. 运行代码查看效果

在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200