前言

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

五、游戏逻辑判定

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

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

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

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

使用python愤怒的小鸟 愤怒的小鸟游戏怎么玩_3d

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;
            }
        }
    }
}
  1. 将游戏物体添加到我们创建的列表里,直接拖拽即可,小鸟注意顺序,小猪不需要

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. 运行代码查看效果

使用python愤怒的小鸟 愤怒的小鸟游戏怎么玩_ci_02