Unity初级案例-愤怒的小鸟:三:07猪的受伤+08弹弓划线操作+09死亡和加分特效的制作+10游戏逻辑的判定,实现多只小鸟的飞出

目录

一.目的

1.想知道:愤怒的小鸟:如何制作

2.做好学习笔记,方便下次查看

二.参考

1.SIKI学院

三.注意

1.版本

操作:1:07猪的受伤

1.游戏逻辑

1.图片裁剪:制作背景等

1.创建空物体,取名字为env​ 

 1.拖拽地面图片在env下面+并且添加碰撞器+调整碰撞器的位置+复制地面

1.设置鸟的角阻力:让其 不会一直滚动

1.运行结果:成功

1.添加小猪,改名字为pig

1.运行结果:

1.小猪添加代码: 

1.小猪设置

 1.运行结果

操作:2: 08弹弓画线操作

1.制作左边弹弓的位置:

1.左右弹弓添加划线组件

1.代码:弹弓划线

1.小鸟设置+划线宽度设置

1.运行结果:成功

操作:3:09死亡、加分特效的制作

1.游戏逻辑 

1.新建爆炸的特效:

1.给特效添加代码:Boom

1.BOOM特效最后一帧添加事件

 1.Boom作为预制件

1.小猪代码:进行销毁的处理

1.运行效果:成功

 1.加分特效图片制作:

1.代码:pig添加加分特效产生、销毁 ​

1.运行效果:成功

 操作:4:10游戏逻辑的判定,实现多只小鸟的飞出

1.游戏逻辑

1.新建空物体:

1.代码: GameManager

1.鸟的代码:

1.猪的代码:

1.Unity设置

1.运行效果:完成


一.目的

1.想知道:愤怒的小鸟:如何制作

2.做好学习笔记,方便下次查看

二.参考

1.SIKI学院

登录 - SiKi学院 - 生命不息,学习不止!

good:学习的网址

三.注意

1.版本

  1. Unity2017.2.0f3
  2. VS2019
  3. UnityHUB 2.5.6

操作:1:07猪的受伤

1.游戏逻辑

1.图片裁剪:制作背景等

 发现无法自动裁剪为2个图片,进行手动裁剪

1.创建空物体,取名字为env

 

 1.拖拽地面图片在env下面+并且添加碰撞器+调整碰撞器的位置+复制地面

 

1.设置鸟的角阻力:让其 不会一直滚动

1.运行结果:成功

 

1.添加小猪,改名字为pig

1.运行结果:

1.小猪添加代码:

 

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

/// <summary>
/// 【Author:xzy;Time:2021-12-29】
/// Function:小猪身上的代码
/// </summary>
public class Pig : MonoBehaviour
{
    /// <summary>bfloatool:最小速度:猪会受伤</summary>
    public float fMinSpeed =5;

    /// <summary>bfloatool:最大速度:猪会死亡</summary>
    public float fMaxSpeed = 10;

    /// <summary>SpriteRenderer:小猪SpriteRenderer组件</summary>
    private SpriteRenderer render;

    /// <summary>Sprite:小猪受伤图片</summary>
    public Sprite hurt;

    private void Awake()
    {
        render = this.GetComponent<SpriteRenderer>();
    }

    /// <summary>
    ///【Author:xzy;Time:2021-12-29】
    /// Function: 小猪碰撞检测
    /// </summary>
    /// <param name="collision"></param>
    private void OnCollisionEnter2D(Collision2D collision)
    {
        print(collision.relativeVelocity.magnitude);

        //碰撞体的相对速度的速度长度大于最大速度:小猪直接死亡
        if (collision.relativeVelocity.magnitude>fMaxSpeed)
        {
            Destroy(this.gameObject);
        }
        else if(collision.relativeVelocity.magnitude>fMinSpeed&&collision.relativeVelocity.magnitude<=fMaxSpeed)
        {
            //碰撞体的相对速度的速度长度大于最小速度&&小于最大速度:小猪受伤:更换图片
            render.sprite = hurt;
        }
    }

}

1.小猪设置

 1.运行结果

操作:2: 08弹弓画线操作

1.制作左边弹弓的位置:

创建空物体+挪动到此位置 +改名字为leftPos

1.左右弹弓添加划线组件

1.代码:弹弓划线

  1. 重点:划线,开始、终止地址
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 【Author:xzy;Time:2021-12-28】
/// Function:小鸟身上的代码
/// </summary>
public class Bird : MonoBehaviour
{
    /// <summary>bool:是否点击</summary>
    private bool bIsClick = false;

    /// <summary>float:计算鸟和弹弓的距离的最大值</summary>
    public float fMaxdis = 3;

    /// <summary>SpringJoint2D:鸟身上弹簧的组件</summary>
    private SpringJoint2D sp;

    /// <summary>Rigidbody2D:鸟身上的物理组件</summary>
    private Rigidbody2D rg;

    /// <summary>Transform:弹弓右边的位置,目的:方便计算鸟和弹弓的距离</summary>
    public Transform rightPos;

    /// <summary>Transform:弹弓左边的位置,目的:方便划线【课程08弹弓画线操作:添加】</summary>
    public Transform leftPos;

    /// <summary>LineRenderer:弹弓右边的划线组件【课程08弹弓画线操作:添加】</summary>
    public LineRenderer right;

    /// <summary>LineRenderer:弹弓左边的划线组件【课程08弹弓画线操作:添加】</summary>
    public LineRenderer left;

    private void Awake()
    {
        sp = this.GetComponent<SpringJoint2D>();//获取小鸟的弹簧组件
        rg = this.GetComponent<Rigidbody2D>();//获取小鸟身上的物理组件
    }

    /// <summary>
    ///【Author:xzy;Time:2021-12-28】
    /// Function: 鼠标按下
    /// </summary>
    private void OnMouseDown()
    {
        bIsClick = true;
        rg.isKinematic = true;//按下小鸟,让其物理组件的动力学开启,从dynamic到kinematic
    }

    /// <summary>
    ///【Author:xzy;Time:2021-12-28】
    /// Function: 鼠标抬起
    /// </summary>
    private void OnMouseUp()
    {
        bIsClick = false;
        rg.isKinematic = false;//松开小鸟,让其物理组件的动力学关闭
        Invoke("Fly", 0.1f);//定时器:唤醒 小鸟飞出的逻辑
    }

    private void Update()
    {
        if (bIsClick)
        {
            //鼠标按下,进行位置的跟随,屏幕坐标转换为世界坐标
            transform.position = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            transform.position += new Vector3(0, 0, -Camera.main.transform.position.z);

            //进行位置限制
            if (Vector3.Distance(transform.position, rightPos.position) > fMaxdis)
            {
                Vector3 pos = (transform.position - rightPos.position).normalized;  //单位化向量:获取方向,鸟的向量减去右边弹弓的位置的向量
                pos *= fMaxdis; //最大长度的向量
                transform.position = pos + rightPos.position;
            }

            Line();
        }
    }

    /// <summary>
    ///【Author:xzy;Time:2021-12-29】
    /// Function: 处理松开小鸟飞出的逻辑
    /// </summary>
    void Fly()
    {
        sp.enabled = false;//松开小鸟,取消掉弹簧组件,小鸟就会飞出
    }

    /// <summary>
    ///【Author:xzy;Time:2021-12-29】【课程08弹弓画线操作:添加】
    /// Function: 画线
    /// </summary>
    void Line()
    {
        right.SetPosition(0, rightPos.position);//画线:右边的起始位置:右边弹弓位置
        right.SetPosition(1, this.transform.position);//画线:右边的终点位置:小鸟位置

        left.SetPosition(0, leftPos.position);
        left.SetPosition(1, this.transform.position);
    }

}

1.小鸟设置+划线宽度设置

1.运行结果:成功

操作:3:09死亡、加分特效的制作

1.游戏逻辑 

1.新建爆炸的特效:

打开图片发现有些特效分的很细,我们将其删除delete,然后框选适合的,然后点击apply

将需要的图片按住ctrl按键,多选,然后拖拽到Hierarchy中

然后新建文件夹“Animations”,取名字为boom

 

制作合适的特效动画 

 改名字为boom+重复 取消掉

1.给特效添加代码:Boom

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

/// <summary>
/// 【Author:xzy;Time:2021-12-29】【09-死亡、加分特效的制作:添加】
/// Function:小猪身上的代码
/// </summary>
public class Boom : MonoBehaviour
{

    /// <summary>
    ///【Author:xzy;Time:2021-12-29】
    /// Function: 小猪碰撞检测
    /// </summary>
    /// <param name="collision"></param>
    public void DestroyBoom()
    {
        Destroy(this.gameObject);
    }
}

1.BOOM特效最后一帧添加事件

 1.Boom作为预制件

1.小猪代码:进行销毁的处理

  1. 重点:实例化出现Boom预制件
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 【Author:xzy;Time:2021-12-29】
/// Function:小猪身上的代码
/// </summary>
public class Pig : MonoBehaviour
{
    /// <summary>bfloatool:最小速度:猪会受伤</summary>
    public float fMinSpeed =5;

    /// <summary>bfloatool:最大速度:猪会死亡</summary>
    public float fMaxSpeed = 10;

    /// <summary>SpriteRenderer:小猪SpriteRenderer组件</summary>
    private SpriteRenderer render;

    /// <summary>Sprite:小猪受伤图片</summary>
    public Sprite hurt;

    /// <summary>GameObject:小猪死亡后爆炸特效</summary>
    public GameObject boom;

    private void Awake()
    {
        render = this.GetComponent<SpriteRenderer>();
    }

    /// <summary>
    ///【Author:xzy;Time:2021-12-29】
    /// Function: 小猪碰撞检测
    /// </summary>
    /// <param name="collision"></param>
    private void OnCollisionEnter2D(Collision2D collision)
    {
        print(collision.relativeVelocity.magnitude);

        //碰撞体的相对速度的速度长度大于最大速度:小猪直接死亡
        if (collision.relativeVelocity.magnitude>fMaxSpeed)
        {
            Dead();
        }
        else if(collision.relativeVelocity.magnitude>fMinSpeed&&collision.relativeVelocity.magnitude<=fMaxSpeed)
        {
            //碰撞体的相对速度的速度长度大于最小速度&&小于最大速度:小猪受伤:更换图片
            render.sprite = hurt;
        }
    }


    /// <summary>
    ///【Author:xzy;Time:2021-12-29】【09-死亡、加分特效的制作:添加】
    /// Function: 小猪碰撞检测
    /// </summary>
    private void Dead()
    {
        Destroy(this.gameObject);//小猪自身销毁
        Instantiate(boom, this.transform.position, Quaternion.identity);//预制件产生:在小猪的位置,角度默认
    }

}

1.运行效果:成功

 1.加分特效图片制作:

先裁剪+改名字为pigScore+作为预制体

 

1.代码:pig添加加分特效产生、销毁

  1.  

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

/// <summary>
/// 【Author:xzy;Time:2021-12-29】
/// Function:小猪身上的代码
/// </summary>
public class Pig : MonoBehaviour
{
    /// <summary>bfloatool:最小速度:猪会受伤</summary>
    public float fMinSpeed =5;

    /// <summary>bfloatool:最大速度:猪会死亡</summary>
    public float fMaxSpeed = 10;

    /// <summary>SpriteRenderer:小猪SpriteRenderer组件</summary>
    private SpriteRenderer render;

    /// <summary>Sprite:小猪受伤图片</summary>
    public Sprite hurt;

    /// <summary>GameObject:小猪死亡后爆炸特效</summary>
    public GameObject boom;

    /// <summary>GameObject:小猪死亡后加分特效</summary>
    public GameObject score;


    private void Awake()
    {
        render = this.GetComponent<SpriteRenderer>();
    }

    /// <summary>
    ///【Author:xzy;Time:2021-12-29】
    /// Function: 小猪碰撞检测
    /// </summary>
    /// <param name="collision"></param>
    private void OnCollisionEnter2D(Collision2D collision)
    {
        print(collision.relativeVelocity.magnitude);

        //碰撞体的相对速度的速度长度大于最大速度:小猪直接死亡
        if (collision.relativeVelocity.magnitude>fMaxSpeed)
        {
            Dead();
        }
        else if(collision.relativeVelocity.magnitude>fMinSpeed&&collision.relativeVelocity.magnitude<=fMaxSpeed)
        {
            //碰撞体的相对速度的速度长度大于最小速度&&小于最大速度:小猪受伤:更换图片
            render.sprite = hurt;
        }
    }


    /// <summary>
    ///【Author:xzy;Time:2021-12-29】【09-死亡、加分特效的制作:添加】
    /// Function: 小猪碰撞检测
    /// </summary>
    private void Dead()
    {
        Destroy(this.gameObject);//小猪自身销毁
        Instantiate(boom, this.transform.position, Quaternion.identity);//boom特效:预制件产生:在小猪的位置,角度默认
       GameObject go= Instantiate(score, this.transform.position+new Vector3(0,0.5f,0), Quaternion.identity);//加分特效:预制件产生:在小猪的位置,角度默认
        Destroy(go, 1.5f);//定时销毁:加分特效
    }

}

1.运行效果:成功

 操作:4:10游戏逻辑的判定,实现多只小鸟的飞出

1.游戏逻辑

1.新建空物体:

  1. GameManager居然图标是个齿轮

位置重置+改名字为GameManager+添加新增代码GameManager

1.代码: GameManager

  1. 重点:单例
  2. 初始化中:除了第一个小鸟其余的都将物体、弹簧禁用。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 【Author:xzy;Time:2021-12-29】【10游戏逻辑的判定,实现多只小鸟的飞出:添加】
/// Function:小猪身上的代码
/// </summary>
public class GameManager : MonoBehaviour
{
    /// <summary>List:所有的小鸟【10游戏逻辑的判定,实现多只小鸟的飞出:添加】</summary>
    public List<Bird> birds;

    /// <summary>List:所有的猪【10游戏逻辑的判定,实现多只小鸟的飞出:添加】</summary>
    public List<Pig> pigs;

    /// <summary>单例【10游戏逻辑的判定,实现多只小鸟的飞出:添加】</summary>
    public static GameManager _instance;

    private void Awake()
    {
        _instance = this;//单例
    }

    void Start()
    {
        Initialized();//【10游戏逻辑的判定,实现多只小鸟的飞出:添加】
    }

    /// <summary>
    ///【Author:xzy;Time:2021-12-29】【10游戏逻辑的判定,实现多只小鸟的飞出:添加】
    /// Function: 小猪碰撞检测
    /// </summary>
    private void Initialized()
    {
        for (int i = 0; i < birds.Count; i++)
        {
            //初始化时候,让第一个小鸟能够被弹,其余的都不能
            if (i == 0)
            {
                birds[i].enabled = true;
                birds[i].sp.enabled = true;
            }
            else
            {
                birds[i].enabled = false;
                birds[i].sp.enabled = false;
            }
        }
    }

    /// <summary>
    ///【Author:xzy;Time:2021-12-29】【10游戏逻辑的判定,实现多只小鸟的飞出:添加】
    /// Function: 下一只小鸟
    /// </summary>
    public void NextBird()
    {
        if (pigs.Count > 0)
        {
            if (birds.Count > 0)
            {
                //下一只飞吧
                Initialized();
            }
            else
            {
                //输了
            }
        }
        else
        {
            //赢了
        }
    }

}

1.鸟的代码:

  1. 重点:列表移除可以这样操作!
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 【Author:xzy;Time:2021-12-28】
/// Function:小鸟身上的代码
/// </summary>
public class Bird : MonoBehaviour
{
    /// <summary>bool:是否点击</summary>
    private bool bIsClick = false;

    /// <summary>float:计算鸟和弹弓的距离的最大值</summary>
    public float fMaxdis = 3;

    /// <summary>SpringJoint2D:鸟身上弹簧的组件</summary>
    [HideInInspector]
    public SpringJoint2D sp;

    /// <summary>Rigidbody2D:鸟身上的物理组件</summary>
    [HideInInspector]
    private Rigidbody2D rg;

    /// <summary>Transform:弹弓右边的位置,目的:方便计算鸟和弹弓的距离</summary>
    public Transform rightPos;

    /// <summary>Transform:弹弓左边的位置,目的:方便划线【课程08弹弓画线操作:添加】</summary>
    public Transform leftPos;

    /// <summary>LineRenderer:弹弓右边的划线组件【课程08弹弓画线操作:添加】</summary>
    public LineRenderer right;

    /// <summary>LineRenderer:弹弓左边的划线组件【课程08弹弓画线操作:添加】</summary>
    public LineRenderer left;

    /// <summary>GameObject:特效【10游戏逻辑的判定,实现多只小鸟的飞出:添加】</summary>
    public GameObject boom;

    private void Awake()
    {
        sp = this.GetComponent<SpringJoint2D>();//获取小鸟的弹簧组件
        rg = this.GetComponent<Rigidbody2D>();//获取小鸟身上的物理组件
    }

    /// <summary>
    ///【Author:xzy;Time:2021-12-28】
    /// Function: 鼠标按下
    /// </summary>
    private void OnMouseDown()
    {
        bIsClick = true;
        rg.isKinematic = true;//按下小鸟,让其物理组件的动力学开启,从dynamic到kinematic
    }

    /// <summary>
    ///【Author:xzy;Time:2021-12-28】
    /// Function: 鼠标抬起
    /// </summary>
    private void OnMouseUp()
    {
        bIsClick = false;
        rg.isKinematic = false;//松开小鸟,让其物理组件的动力学关闭
        Invoke("Fly", 0.1f);//定时器:唤醒 小鸟飞出的逻辑
    }

    private void Update()
    {
        if (bIsClick)
        {
            //鼠标按下,进行位置的跟随,屏幕坐标转换为世界坐标
            transform.position = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            transform.position += new Vector3(0, 0, -Camera.main.transform.position.z);

            //进行位置限制
            if (Vector3.Distance(transform.position, rightPos.position) > fMaxdis)
            {
                Vector3 pos = (transform.position - rightPos.position).normalized;  //单位化向量:获取方向,鸟的向量减去右边弹弓的位置的向量
                pos *= fMaxdis; //最大长度的向量
                transform.position = pos + rightPos.position;
            }

            Line();
        }
    }

    /// <summary>
    ///【Author:xzy;Time:2021-12-29】
    /// Function: 处理松开小鸟飞出的逻辑
    /// </summary>
    void Fly()
    {
        sp.enabled = false;//松开小鸟,取消掉弹簧组件,小鸟就会飞出
        Invoke("Next", 5);//定时器:一段时候后调用Next方法
    }

    /// <summary>
    ///【Author:xzy;Time:2021-12-29】【课程08弹弓画线操作:添加】
    /// Function: 画线
    /// </summary>
    void Line()
    {
        right.SetPosition(0, rightPos.position);//画线:右边的起始位置:右边弹弓位置
        right.SetPosition(1, this.transform.position);//画线:右边的终点位置:小鸟位置

        left.SetPosition(0, leftPos.position);
        left.SetPosition(1, this.transform.position);
    }

    /// <summary>
    ///【Author:xzy;Time:2021-12-29】【10游戏逻辑的判定,实现多只小鸟的飞出:添加】
    /// Function: 下一只小鸟被弹
    /// </summary>
    private void Next()
    {
        GameManager._instance.birds.Remove(this);//移除列表中此时小鸟元素
        Destroy(this.gameObject);//摧毁这个小鸟
        Instantiate(boom, this.transform.position, Quaternion.identity);//产生特效
        GameManager._instance.NextBird();//下一只小鸟出现
    }
}

1.猪的代码:

  1. 重点:为了Pig代码让猪和木棍都能使用,开通一个bool
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 【Author:xzy;Time:2021-12-29】
/// Function:小猪身上的代码
/// </summary>
public class Pig : MonoBehaviour
{
    /// <summary>bfloatool:最小速度:猪会受伤</summary>
    public float fMinSpeed =5;

    /// <summary>bfloatool:最大速度:猪会死亡</summary>
    public float fMaxSpeed = 10;

    /// <summary>SpriteRenderer:小猪SpriteRenderer组件</summary>
    private SpriteRenderer render;

    /// <summary>Sprite:小猪受伤图片</summary>
    public Sprite hurt;

    /// <summary>GameObject:小猪死亡后爆炸特效</summary>
    public GameObject boom;

    /// <summary>GameObject:小猪死亡后加分特效</summary>
    public GameObject score;

    /// <summary>bool:是否是猪,目的此代码和木块代码混用【10游戏逻辑的判定,实现多只小鸟的飞出:添加】</summary>
    public bool bIsPig = false;


    private void Awake()
    {
        render = this.GetComponent<SpriteRenderer>();
    }

    /// <summary>
    ///【Author:xzy;Time:2021-12-29】
    /// Function: 小猪碰撞检测
    /// </summary>
    /// <param name="collision"></param>
    private void OnCollisionEnter2D(Collision2D collision)
    {
        print(collision.relativeVelocity.magnitude);

        //碰撞体的相对速度的速度长度大于最大速度:小猪直接死亡
        if (collision.relativeVelocity.magnitude>fMaxSpeed)
        {
            Dead();
        }
        else if(collision.relativeVelocity.magnitude>fMinSpeed&&collision.relativeVelocity.magnitude<=fMaxSpeed)
        {
            //碰撞体的相对速度的速度长度大于最小速度&&小于最大速度:小猪受伤:更换图片
            render.sprite = hurt;
        }
    }


    /// <summary>
    ///【Author:xzy;Time:2021-12-29】【09-死亡、加分特效的制作:添加】
    /// Function: 小猪碰撞检测
    /// </summary>
    private void Dead()
    {
        if (bIsPig)
        {
            GameManager._instance.pigs.Remove(this);//猪列表移除此猪元素【10游戏逻辑的判定,实现多只小鸟的飞出:添加】
        }
        Destroy(this.gameObject);//小猪自身销毁
        Instantiate(boom, this.transform.position, Quaternion.identity);//boom特效:预制件产生:在小猪的位置,角度默认
       GameObject go= Instantiate(score, this.transform.position+new Vector3(0,0.5f,0), Quaternion.identity);//加分特效:预制件产生:在小猪的位置,角度默认
        Destroy(go, 1.5f);//定时销毁:加分特效
    }

}

1.Unity设置

 

1.运行效果:完成

猜你喜欢

转载自blog.csdn.net/qq_40544338/article/details/122209748