Unity 制作愤怒的小鸟

这篇具有很好参考价值的文章主要介绍了Unity 制作愤怒的小鸟。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


参考视频: 【SiKi学院Unity】Unity初级案例 - 愤怒的小鸟



一、项目准备

资源下载: http://www.sikiedu.com/course/134

新建工程:

Unity 制作愤怒的小鸟

选择2D,填写项目名称并选择项目路径:
Unity 制作愤怒的小鸟


将资源中的ImageMusic复制到项目文件夹中:

Unity 制作愤怒的小鸟
Unity 制作愤怒的小鸟



二、切片

选择猪和鸟的第一章图片,将其Sprite Mode改为MultipleApply
Unity 制作愤怒的小鸟


如下图所示进行切片:
Unity 制作愤怒的小鸟


发现四个爆炸烟雾未切分好,手动切分一下:
Unity 制作愤怒的小鸟


Apply:
Unity 制作愤怒的小鸟


在场景中拖入弹弓和小鸟,设置层级关系:
Unity 制作愤怒的小鸟



三、实现小鸟的拖拽与飞出


1. 添加并设置Spring Joint 2D

为小鸟添加Spring Joint 2D组件,添加后会自动添加刚体组件:
Unity 制作愤怒的小鸟


同时给弹弓右部加上刚体组件,并设置为Static(防止其受重力影响):
Unity 制作愤怒的小鸟


将弹弓右部的刚体拖到Spring Joint 2D中,并设置Spring Joint 2D的各项参数:
Unity 制作愤怒的小鸟


2. 实现小鸟跟随鼠标移动

添加碰撞体和Bird脚本:
Unity 制作愤怒的小鸟


bird.cs:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Bird : MonoBehaviour
{
    private bool isClick = false;


    private void Update()
    {
        MoveWithMouse();
    }

    private void MoveWithMouse()
    {
        // 让小鸟跟随鼠标的位置
        if (isClick)
        {
            transform.position = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            transform.position += new Vector3(0, 0, -Camera.main.transform.position.z);
        }
    }

    // 鼠标按下
    private void OnMouseDown()
    {
        isClick = true;   
    }

    // 鼠标抬起
    private void OnMouseUp()
    {
        isClick = false;
    }

}

此时小鸟被鼠标拖拽时会跟随鼠标移动。


3. 限定小鸟最大拖拽距离


首先在弹弓右部设置一个点,作为小鸟绕着转的点:
Unity 制作愤怒的小鸟


Bird.cs中声明rightPos 和 maxDis变量:

    public Transform rightPos;   // 弹弓右部点,即拖拽小鸟时让其跟着转
    public float maxDis;  // 最大推拽距离

修改MoveWithMouse()如下:

    private void MoveWithMouse()
    {
        // 让小鸟跟随鼠标的位置
        if (isClick)
        {
            transform.position = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            transform.position += new Vector3(0, 0, -Camera.main.transform.position.z);

            // 限定小鸟最大拖拽距离
            if (Vector2.Distance(transform.position, rightPos.position) >= maxDis)
            {
                transform.position = rightPos.position + (transform.position - rightPos.position).normalized * maxDis;
            }
        }
    }

Inspector面板中将rightPos拖拽到bird脚本中,并设置maxDis,此时小鸟被限定了拖拽距离:
Unity 制作愤怒的小鸟


4. 实现小鸟飞出

鼠标按下时,刚体状态设置为动力学。
在鼠标松开时,动力学设为false,一段时间后禁用SpringJoint2D组件:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Bird : MonoBehaviour
{
    private SpringJoint2D springJoint;
    private Rigidbody2D rb;

    public Transform rightPos;   // 弹弓右部点,即拖拽小鸟时让其跟着转
    public float maxDis;  // 最大推拽距离


    private bool isClick = false;


    private void Start()
    {
        springJoint = GetComponent<SpringJoint2D>();
        rb = GetComponent<Rigidbody2D>();
    }

    private void Update()
    {
        MoveWithMouse();
    }

    private void MoveWithMouse()
    {
        // 让小鸟跟随鼠标的位置
        if (isClick)
        {
            transform.position = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            transform.position += new Vector3(0, 0, -Camera.main.transform.position.z);

            // 限定小鸟最大拖拽距离
            if (Vector2.Distance(transform.position, rightPos.position) >= maxDis)
            {
                transform.position = rightPos.position + (transform.position - rightPos.position).normalized * maxDis;
            }
        }
    }

    // 鼠标按下
    private void OnMouseDown()
    {
        isClick = true;
        rb.isKinematic = true;
    }

    // 鼠标抬起
    private void OnMouseUp()
    {
        isClick = false;
        rb.isKinematic = false;
        Invoke(nameof(Fly), 0.12f);
    }

    private void Fly()
    {
        springJoint.enabled = false;
    }

}


5. 实现弹弓的划线


在弹弓上创建一个leftPos点,此时leftPosrightPos两个点用于划线:
Unity 制作愤怒的小鸟


left添加Line Renderer组件:
Unity 制作愤怒的小鸟


设置材质、颜色和长度:
Unity 制作愤怒的小鸟


将该组件复制到right上:
Unity 制作愤怒的小鸟
Unity 制作愤怒的小鸟


编写代码:
bird.cs:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Bird : MonoBehaviour
{
    private SpringJoint2D springJoint;
    private Rigidbody2D rb;

    [Header("弹弓")]
    public Transform rightPos;   // 弹弓右部点,即拖拽小鸟时让其跟着转; 同时画线
    public Transform leftPos;    // 弹弓左部点, 画线
    public LineRenderer leftLine;
    public LineRenderer rightLine;

    [Space]
    public float maxDis;  // 最大推拽距离


    private bool isClick = false;


    private void Start()
    {
        springJoint = GetComponent<SpringJoint2D>();
        rb = GetComponent<Rigidbody2D>();
    }

    private void Update()
    {
        MoveWithMouse();
    }

    private void MoveWithMouse()
    {
        // 让小鸟跟随鼠标的位置
        if (isClick)
        {
            transform.position = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            transform.position += new Vector3(0, 0, -Camera.main.transform.position.z);

            // 限定小鸟最大拖拽距离
            if (Vector2.Distance(transform.position, rightPos.position) >= maxDis)
            {
                transform.position = rightPos.position + (transform.position - rightPos.position).normalized * maxDis;
            }

            DrawLine();
        }
    }

    // 鼠标按下
    private void OnMouseDown()
    {
        isClick = true;
        rb.isKinematic = true;
    }

    // 鼠标抬起
    private void OnMouseUp()
    {
        isClick = false;
        rb.isKinematic = false;
        DeleteLine();  // 删除弹弓的线
        Invoke(nameof(Fly), 0.12f);
    }

    // 飞出
    private void Fly()
    {
        springJoint.enabled = false;
    }

    // 画线
    private void DrawLine()
    {
        // 设置线的两个端点
        leftLine.SetPosition(0, leftPos.position);
        leftLine.SetPosition(1, transform.position);

        rightLine.SetPosition(0, rightPos.position);
        rightLine.SetPosition(1, transform.position);
    }

    // 删除线
    private void DeleteLine()
    {
        leftLine.SetPosition(1, leftPos.position);
        rightLine.SetPosition(1, rightPos.position);
    }
}

此时拖拽小鸟时可正常划线,松开则线消失。


6. 让小鸟不能重复拖拽


此时小鸟被拖拽放飞后,再次按住小鸟任然能回到弹弓上。

为了解决该bug,给小鸟添加一个bool参数:

    private bool flied = false;  // 是否飞过,用以让小鸟不能重复拖拽

鼠标抬起后,设置为true:

    // 鼠标抬起
    private void OnMouseUp()
    {
        isClick = false;
        flied = true;
        rb.isKinematic = false;
        DeleteLine();  // 删除弹弓的线
        Invoke(nameof(Fly), 0.12f);
    }

鼠标按下后,如果flied已经为true,则无效:

    // 鼠标按下
    private void OnMouseDown()
    {
        if (flied)
            return;
        isClick = true;
        rb.isKinematic = true;
    }

此时小鸟只能被拖拽一次。



四、场景搭建


选择场景1进行切割:
Unity 制作愤怒的小鸟


将地面拖入并添加碰撞体:
Unity 制作愤怒的小鸟


创建预制体相关文件夹,并将其拖入:
Unity 制作愤怒的小鸟


设置地面:
Unity 制作愤怒的小鸟


同理,设置天空:
Unity 制作愤怒的小鸟



五、实现小鸟攻击猪


添加猪,并添加相关组件并设置图层:
Unity 制作愤怒的小鸟


将鸟和猪的角阻力都设置为2,防止其在地面滚动不停止:
Unity 制作愤怒的小鸟


1. 猪的受伤与死亡


给猪添加Pig脚本:
Unity 制作愤怒的小鸟


设置猪受到小鸟的碰撞时,受伤和死亡应该达到的相对速度:

    public float hurtSpeed = 5.0f;  // 受伤速度
    public float deadSpeed = 10.0f;  // 死亡速度

设置猪受伤后的图片:

    // 受伤图片
    public Sprite hurtSprite;

Unity 制作愤怒的小鸟


拖入相应的烟雾的图片到场景中:
Unity 制作愤怒的小鸟

创建boom动画:
Unity 制作愤怒的小鸟


打开Animation进行相应的调整:
Unity 制作愤怒的小鸟


同时将该动画取消循环播放:
Unity 制作愤怒的小鸟


Boom添加一个脚本Boom:
Unity 制作愤怒的小鸟


编写代码:
Boom.cs:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Boom : MonoBehaviour
{
    public void DestorySelf()
    {
        Destroy(gameObject);
    }
}

Animation中设置,当播放完之后执行该函数,即销毁自身:
Unity 制作愤怒的小鸟

Boom物体制成预制体:
Unity 制作愤怒的小鸟


猪的死亡逻辑:

若相对速度大于死亡速度:则死亡;
若相对速度只是大于受伤速度:此时猪若是受伤状态,则死亡;反之则受伤

Pig.cs中,实现猪的受伤与死亡:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Pig : MonoBehaviour
{
    private SpriteRenderer spriteRenderer;

    // 受伤图片
    public Sprite hurtSprite;
    public GameObject boomPrefab;

    [Header("相对速度")]
    public float hurtSpeed = 5.0f;  // 受伤速度
    public float deadSpeed = 10.0f;  // 死亡速度

    private bool isHurt = false;

    private void Start()
    {
        spriteRenderer = GetComponent<SpriteRenderer>();
    }

    private void OnCollisionEnter2D(Collision2D collision)
    {
        float relativeV = collision.relativeVelocity.magnitude;
        print(relativeV);
        // 大于死亡速度
        if (relativeV >= deadSpeed)
        {
            Dead();
        }
        // 大于受伤速度
        else if (relativeV >= hurtSpeed)
        {
            if (isHurt)
                Dead();
            else
            {
                isHurt = true;
                spriteRenderer.sprite = hurtSprite;
            }
        }
    }

    // 死亡,生成爆炸动画和分数
    private void Dead()
    {
        Instantiate(boomPrefab, transform.position, Quaternion.identity);
        Destroy(gameObject);
    }

}

2. 猪的加分

切割分数图片:
Unity 制作愤怒的小鸟


拖拽出一个分数并制为预制体:
Unity 制作愤怒的小鸟


编写pig.cs代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Pig : MonoBehaviour
{
    private SpriteRenderer spriteRenderer;

    // 受伤图片
    public Sprite hurtSprite;
    public GameObject boomPrefab;
    public GameObject scorePrefab;

    [Header("相对速度")]
    public float hurtSpeed = 5.0f;  // 受伤速度
    public float deadSpeed = 10.0f;  // 死亡速度

    private bool isHurt = false;

    [Space]
    public float scoreYOffset = 0.65f;  // 分数相对猪的Y位置

    private void Start()
    {
        spriteRenderer = GetComponent<SpriteRenderer>();
    }

    private void OnCollisionEnter2D(Collision2D collision)
    {
        float relativeV = collision.relativeVelocity.magnitude;
        print(relativeV);
        // 大于死亡速度
        if (relativeV >= deadSpeed)
        {
            Dead();
        }
        // 大于受伤速度
        else if (relativeV >= hurtSpeed)
        {
            if (isHurt)
                Dead();
            else
            {
                isHurt = true;
                spriteRenderer.sprite = hurtSprite;
            }
        }
    }

    // 死亡,生成爆炸动画和分数
    private void Dead()
    {
        GameManager.instance.pigs.Remove(this);
        Instantiate(boomPrefab, transform.position, Quaternion.identity);
        GameObject scoreObject = Instantiate(scorePrefab, transform.position + new Vector3(0, scoreYOffset, 0),
            Quaternion.identity);
        Destroy(scoreObject, 1.5f);
        Destroy(gameObject);
    }

}


六、实现多只鸟的控制

将小鸟制为预制体,并复制两只:

Unity 制作愤怒的小鸟


创建一个Game Manager空物体,新建并挂上GameManager脚本:
Unity 制作愤怒的小鸟

使用单例模式并用列表存储小鸟和猪:

public class GameManager : MonoBehaviour
{
    public static GameManager instance;

    public List<Bird> birds;
    public List<Pig> pigs;


    private void Awake()
    {
        instance = this;
    }

}

Bird中编写,让小鸟飞出几秒后销毁,并生成爆炸动画,并从GameManager的列表中移除:


    private bool isClick = false;
    private bool flied = false;  // 是否飞过,用以让小鸟不能重复拖拽

    // 飞出
    private void Fly()
    {
        springJoint.enabled = false;
        Invoke(nameof(DestroySelf), flyTime);
    }
    
    // 飞出5秒后销毁
    private void DestroySelf()
    {
        GameManager.instance.birds.Remove(this);
        Instantiate(boomPrefab, transform.position, Quaternion.identity);
        Destroy(gameObject);
    }

同理,猪死亡时,在GameManger的列表中也需要删除:

    // 死亡,生成爆炸动画和分数
    private void Dead()
    {
        GameManager.instance.pigs.Remove(this);
        Instantiate(boomPrefab, transform.position, Quaternion.identity);
        GameObject scoreObject = Instantiate(scorePrefab, transform.position + new Vector3(0, scoreYOffset, 0),
            Quaternion.identity);
        Destroy(scoreObject, 1.5f);
        Destroy(gameObject);
    }

GameManager中,起初启用第一只小鸟、禁用其他小鸟的脚本和SpringJoint,并在小鸟销毁后判断游戏状态以及是否启用下一只小鸟:
GameManager.cs:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameManager : MonoBehaviour
{
    public static GameManager instance;

    public List<Bird> birds;
    public List<Pig> pigs;

    private Vector3 originBirdPos;  // 小鸟初始位置

    private void Awake()
    {
        instance = this;
        if (birds.Count > 0)
            originBirdPos = birds[0].transform.position;
        InitBird();
    }

    // 初始化小鸟
    private void InitBird()
    {
        for(int i = 0; i <birds.Count; i++)
        {
            if (i == 0)
            {
                birds[i].transform.position = originBirdPos;
                birds[i].enabled = true;
                birds[i].GetComponent<SpringJoint2D>().enabled = true;
            }
            else
            {
                birds[i].enabled = false;
                birds[i].GetComponent<SpringJoint2D>().enabled = false;
            }
        }
    }

    // 判断游戏状态 及 是否启用下一只小鸟
    public void Next()
    {
        if (pigs.Count == 0)
        {
            // 游戏胜利
        }
        else
        {
            if (birds.Count == 0)
            {
                // 游戏失败
            }
            else
            {
                InitBird();
            }
        }
    }

}

在小鸟销毁后,调用`Next()`: `bird.cs`:
    // 飞出5秒后销毁
    private void DestroySelf()
    {
        GameManager.instance.birds.Remove(this);
        GameManager.instance.Next();
        Instantiate(boomPrefab, transform.position, Quaternion.identity);
        Destroy(gameObject);
    }

最后在Inspector面板中拖拽小鸟和猪后,可正常控制多只小鸟。



七、小鸟尾迹的实现

导入素材中的Unity包:
Unity 制作愤怒的小鸟

Unity 制作愤怒的小鸟

只添加Weapon Trail
Unity 制作愤怒的小鸟


给小鸟添加Trail Renderer组件:
Unity 制作愤怒的小鸟


设置拖尾的材质、持续时间已经宽度:
Unity 制作愤怒的小鸟


同时加载到其他预制体上:
Unity 制作愤怒的小鸟


拖尾效果:
Unity 制作愤怒的小鸟



八、给猪造房子


切割:
Unity 制作愤怒的小鸟


以方形木头为例:
Unity 制作愤怒的小鸟


Pig.cs脚本中添加bool的isPig,让木块等也能使用:

    [Space]
    public bool isPig = false;
    
    // 死亡,生成爆炸动画和分数
    private void Dead()
    {
        if (isPig)
            GameManager.instance.pigs.Remove(this);
        Instantiate(boomPrefab, transform.position, Quaternion.identity);
        GameObject scoreObject = Instantiate(scorePrefab, transform.position + new Vector3(0, scoreYOffset, 0),
            Quaternion.identity);
        Destroy(scoreObject, 1.5f);
        Destroy(gameObject);
    }

将之前的猪勾选isPig
Unity 制作愤怒的小鸟


将木头挂载该脚本并不勾选isPig,然后设置hurtSpeed等参数 :
Unity 制作愤怒的小鸟

木头需要组件: 刚体、碰撞体、Pig脚本


同理,新增其他物品。

设置简单的场景如下:
Unity 制作愤怒的小鸟


运行效果:
Unity 制作愤怒的小鸟



九、游戏胜利、失败界面


1. 显示胜利、失败基本界面


切割:

Unity 制作愤怒的小鸟


制作UI(参考第15集).

Lose UI:
Unity 制作愤怒的小鸟


Win UI:
Unity 制作愤怒的小鸟


在游戏胜利时,根据关卡中的剩余小鸟数量,判断应该获得的星星数量,GameManager.cs部分代码如下:

    [Header("UI")]
    public GameObject winUI;
    public GameObject loseUI;

    [Header("胜利得到星星的数量需要的小鸟存活数")]
    public int birdNumOf3Star;
    public int birdNumOf2Star;

    // 判断游戏状态 及 是否启用下一只小鸟
    public void Next()
    {
        if (pigs.Count == 0)
        {
            // 游戏胜利
            winUI.SetActive(true);
        }
        else
        {
            if (birds.Count == 0)
            {
                // 游戏失败
                loseUI.SetActive(true);
            }
            else
            {
                InitBird();
            }
        }
    }

    public void WinLevel()
    {
        if (birds.Count >= birdNumOf3Star)  // 3颗星星
        {

        }
        else if (birds.Count >= birdNumOf2Star) // 2颗
        {

        }
        else // 1颗
        {

        }
    }

同时,为Win UI创建一个Win.cs的脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Win : MonoBehaviour
{
    // 动画播放完(显示UI后) 显示星星
    public void ShowStar()
    {
        GameManager.instance.WinLevel();
    }
}

在动画结束后调用:
Unity 制作愤怒的小鸟


2. 星星粒子效果


切割星星:
Unity 制作愤怒的小鸟


三颗星星的摆放:
Unity 制作愤怒的小鸟


根据https://www.bilibili.com/video/BV1qb411c76x?p=16第16到18集设置星星的粒子效果。


3. 星星显示


GameManager.cs中,利用协程,每隔0.7s,显示一颗星星:

    public GameObject[] starsUI = new GameObject[3];
    
    public void WinLevel()
    {
        if (birds.Count >= birdNumOf3Star)  // 3颗星星
        {
            StartCoroutine("ShowTheStar", 3);
        }
        else if (birds.Count >= birdNumOf2Star) // 2颗
        {
            StartCoroutine("ShowTheStar", 2);
        }
        else // 1颗
        {
            StartCoroutine("ShowTheStar", 1);
        }
    }

    // 每隔0.7秒,显示一颗星星
    IEnumerator ShowTheStar(int num)
    {
        for(int i = 0; i < num; i++)
        {
            starsUI[i].SetActive(true);
            yield return new WaitForSeconds(0.7f);
        }
    }

Insepctor面板中拖入星星:
Unity 制作愤怒的小鸟


此时正常显示星星:

Unity 制作愤怒的小鸟




十、暂停界面


1. 界面以及动画

P20

暂停按钮:

Unity 制作愤怒的小鸟


暂停面板:

Unity 制作愤怒的小鸟


实现暂停动画:

Unity 制作愤怒的小鸟

实现继续动画:

Unity 制作愤怒的小鸟


两个动画都取消循环播放:

Unity 制作愤怒的小鸟


2. 实现暂停和继续


Animator中创建两个Trigger参数,并将两个动画相连:

Unity 制作愤怒的小鸟


Pause动画与Resume的连线:

Unity 制作愤怒的小鸟

Unity 制作愤怒的小鸟


创建PausePanle脚本并放入Pause Panel:

Unity 制作愤怒的小鸟

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PausePanel : MonoBehaviour
{
    private Animator anim;

    // Start is called before the first frame update
    void Start()
    {
        anim = GetComponent<Animator>();
    }


    // 点击继续按钮
    public void Resume()
    {
        anim.SetTrigger("resume");
    }

    // 继续动画结束后,调用
    public void AfterResume()
    {
        this.gameObject.SetActive(false);
        anim.SetTrigger("pause");  // 切换回暂停动画,下次active true时则调用暂停动画
    }

}

GameManager.cs中添加代码:

    [Space]
    public GameObject pausePanel;

    // 暂停按钮调用函数
    public void PauseGame()
    {
        pausePanel.SetActive(true);
    }

Inspector面板中,拖入Pause Panel:

Unity 制作愤怒的小鸟


Pause Btn添加点击事件,为GameManager的暂停方法:

Unity 制作愤怒的小鸟


Resume Btn添加点击事件,为Pause PanelPause方法:

Unity 制作愤怒的小鸟


Resume动画结束时,调用AfterResume函数:

Unity 制作愤怒的小鸟


效果:

Unity 制作愤怒的小鸟


3. 实现Restart Level


GameManager.cs中添加重启关卡方法:

using UnityEngine.SceneManagement;

    // 重启关卡
    public void RestartLevel()
    {
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
    }

在各个重启按钮中调用:
Unity 制作愤怒的小鸟
Unity 制作愤怒的小鸟
Unity 制作愤怒的小鸟


运行效果:
Unity 制作愤怒的小鸟



十一、相机跟随


1. 跟随第一只小鸟

打开Package Manager:
Unity 制作愤怒的小鸟


下载Cinemachine:
Unity 制作愤怒的小鸟


添加一个2D Camera
Unity 制作愤怒的小鸟


将第一只小鸟拖入Follow,让相机跟随小鸟:
Unity 制作愤怒的小鸟


调节部分参数,以选取合适位置:
Unity 制作愤怒的小鸟


同时创建一个名为Camera BG的空物体,为其加上Polygon碰撞体,勾选Is Trigger,用作相机的范围,(即小鸟若超出该范围,相机则不跟随):
Unity 制作愤怒的小鸟


在刚刚的CM vcam1中,添加CinemachineConfiner
Unity 制作愤怒的小鸟


将刚刚的Camera BG拖入:
Unity 制作愤怒的小鸟


2. 按顺序跟随多只小鸟

GameManager中引入:

using Cinemachine;

若报错,则导入Cinemachine示例程序场景:
Unity 制作愤怒的小鸟


GameManager.cs更改的代码:

using Cinemachine;

    [Header("相机和弹弓")]
    public CinemachineVirtualCamera virtualCamera;
    public Transform slingshotLeftPos;    // 弹弓左部点,用于小鸟死后视角回到弹弓

    // 初始化小鸟
    private void InitBird()
    {
        for(int i = 0; i <birds.Count; i++)
        {
            if (i == 0)
            {
                birds[i].transform.position = originBirdPos;
                birds[i].enabled = true;
                birds[i].GetComponent<SpringJoint2D>().enabled = true;
                virtualCamera.Follow = birds[i].transform;  // 相机跟随小鸟
            }
            else
            {
                birds[i].enabled = false;
                birds[i].GetComponent<SpringJoint2D>().enabled = false;
            }
        }
    }
    
	// 判断游戏状态 及 是否启用下一只小鸟
    public void Next()
    {
        virtualCamera.Follow = slingshotLeftPos;
        virtualCamera.transform.position = slingshotLeftPos.position;

        if (pigs.Count == 0)
        {
            // 游戏胜利
            winUI.SetActive(true);
        }
        else
        {
            if (birds.Count == 0)
            {
                // 游戏失败
                loseUI.SetActive(true);
            }
            else
            {
                InitBird();
            }
        }
    }

最终演示效果:

Unity 制作愤怒的小鸟



参考

【SiKi学院Unity】Unity初级案例 - 愤怒的小鸟文章来源地址https://www.toymoban.com/news/detail-447180.html

到了这里,关于Unity 制作愤怒的小鸟的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python毕设分享 愤怒的小鸟游戏设计与实现 (源码)

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 愤怒的小鸟游戏设计与实现 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 项目获取: https://gitee.com/sinonfin/syst

    2024年02月05日
    浏览(32)
  • C++---状态压缩dp---愤怒的小鸟(每日一道算法2023.4.19)

    注意事项: 难度警告!这题在NOIP中也算偏难的题,量力而行。 本题为\\\"状态压缩dp—最短Hamilton路径\\\"的扩展题,建议先阅读这篇文章并理解。 本题是\\\"重复覆盖问题\\\"可以使用\\\"Dancing Links\\\"做,但我们这里是用的状态压缩dp来写。 题目: Kiana 最近沉迷于一款神奇的游戏无法自拔。

    2023年04月23日
    浏览(23)
  • Python版经典小游戏愤怒的小鸟源代码,基于pygame+pymunk

    Python版经典小游戏愤怒的小鸟源代码,基于pygame+pymunk 程序依赖:pygame 2.0.1, pymunk 5.5.0 直接运行main.py 完整代码下载地址:Python版经典小游戏愤怒的小鸟源代码 tool.py 完整代码下载地址:Python版经典小游戏愤怒的小鸟源代码

    2024年02月16日
    浏览(34)
  • [渝粤教育] 辽宁对外经贸学院 数字新技术 参考 资料

    教育 -数字新技术-4-章节资料考试资料-辽宁对外经贸学院【】 第一单元测验 1、【单选题】1. 云计算是对(D)技术的发展与运用 云计算是对( )技术的发展与运用。 A、并行计算 B、网格计算 C、分布式计算 D、三个选项都是 参考资料【 】 2、【单选题】从研究现状上看,下

    2023年04月25日
    浏览(51)
  • 【Unity项目实战】手把手教学:飞翔的小鸟(6)添加障碍

            承接上一篇:【Unity项目实战】手把手教学:飞翔的小鸟(5)背景滚动,我们已经让主角在停止不动的情况下,移动背景图,使得主角小鸟像是自己往前移动了一样,接下来我们将继续往下,讲解如何添加障碍。         将障碍物素材(拉两个)拖拉到主界面中

    2024年02月09日
    浏览(35)
  • Unity学习记录4——视频进度条制作,视频倍速、快进及后退

    1.使用AVPro Video插件,进行制作 2.效果演示     3.代码

    2024年02月03日
    浏览(36)
  • 用unity插件AVProVideo制作一个视频播放器

    功能键有:播放/暂停,是否循环播放,音量控制,倍速控制,视频切换,后退前进,显示时间。 将对应内容拖到对应位置即可。 其中视频存放在streamingAssets文件夹中,视频名称存放在一个名为“name”的txt文件中,通过读取name中视频的名称控制上一个,下一个视频的播放。

    2024年02月11日
    浏览(30)
  • Unity学习笔记--siki学院保卫萝卜

      在同一个脚本中的执行先后顺序:先左后右 Inspector 赋值   外部调用 Awake OnEnable Start 脚本对象的失活与激活不作用于Awake方法,当方法中只有Awake方法时,控制脚本激活失活的对勾会消失掉  当物体失活又激活的时候,会调用OnEnable 方法,Awake和Start只会在最开始调用一次,

    2024年02月16日
    浏览(30)
  • Unity技能学院——RPG动作类游戏角色普攻的实现

    实现角色普攻是每个RPG类型动作游戏都会实现的功能,在游戏过程中,玩家与敌人相互攻击,产生攻击判定、血量减少、攻击效果等等。 这是几乎是我们每一个想上手RPG游戏开发的必修课。 因此本期内容讲各位零基础的学友带来最简单易上手的角色普攻教学。保证你一遍就

    2024年04月16日
    浏览(38)
  • 视频分辨率/帧率/码率选择参考

    1. 视频码率与分辨率的参考表     1080*720的分辨率,用5000K左右;     720*576的分辨率,用3500K左右;     640*480的分辨率,用1500K左右。 2. 计算公式 基本算法:码率(kbps)=文件大小(KB)*8/时间(秒) 举例:视频文件的容量为3.446G,视频长度100分钟(6000秒), 计

    2024年02月06日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包